Существуют 2 способа соединения с базой Oracle:
1) Через ODBC (Open DataBase Connectivity)
2) Через OOO4O (Oracle Objects for OLE)
Небольшое отступление касаемо их отличий.
Что такое ODBC?
ОDBC - это стандартизованное API, разработанное по спецификации SQL Access Group, которое
позволяет соединяться с любой базой данных, поддерживающей SQL. В нем определен стандартный
набор функций, кодов ошибок и типов данных, которые можно использовать для разработки приложений,
независимо от базы данных. Обычно, ODBC используется, если требуется независимость от базы данных,
или осуществляется работа с разными источниками данных.
Основные преимущества:
- Простота работы с ним
- Входит в поставку ОС Windows
Недостатки:
- (Главное) Не поддерживает большинства расширений Oracle
- Производительность ниже чем у OOO4O
Что такое Oracle Objects for OLE (OO4O)?
OO4O – это средство доступа к БД, базирующееся на COM, позволяющее получать, оптимизированный доступ к БД Oracle.
Входит в поставку Oracle и открывает перед разработчиками доступ ко всем возможностям предоставляемым БД Oracle.
Основные преимущества:
- Полная поддержка координатора транзакций в Microsoft Transaction Server (MTS)
- (Главное) Простой доступ к переменным и объектам специализированных типов данных реализованных в Oracle, включая:
- Object References (REFs – ссылочный тип)
- Object Instances (Objects – объектный тип)
- Nested Tables (Вложенные таблицы)
- Varrays (Массивы переменной длины)
- BLOBs, CLOBs, NCLOBs and BFILEs
- Поддержка параметров типа курсор (это единственный способ возвратить результат выполнения оператора SELECT (Resultset) из PL/SQL-блока или хранимых PL/SQ-процедур)
- Полный доступ к возможностям Oracle Advanced Queuing
- Эффективное управление подключениями к БД и пользовательскими сессиями (connection pooling и multiplexing)
- Большая производительность
Недостатки: Необходимо установить клиент Oracle на каждой пользовательской машине где планируется работать через OO4O.
Теперь рассмотрим сам процесс работы через OO4O.
Для начала нужно установить клиентскую часть Oracle которая идёт вместе с поставкой СУБД Oracle.
Затем сконфигурировать файл tnsnames.ora который находится в директории:
...\oracle\ora92\network\admin
Приведите содержание файла к следующему виду:
ИмяБазы=
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=IPАдресСервера)
(PORT=1521)
)
(CONNECT_DATA=
(SERVICE_NAME=ИмяБазы)
)
)
Введите свое ИмяБазы и IPАдресСервера и сохраните файл.
В 1С соединение с базой выглядит следующим образом:
session = Новый COMОбъект("OracleInProcServer.XOraSession"); //Создаем COM обьект
db = session.OpenDatabase(Base,Login+"/"+Pass,); //Открываем базу
Если метод session.LastServerErr возвратит ноль значит соединение прошло успешно, если возвратит другое число
значит произошла ошибка, которая будет описана в методе session.LastServerErrText
Пример соединения:
Функция ПодключитьсяКБазеOralce(Base,Login,Pass)
Попытка
session = Новый COMОбъект("OracleInProcServer.XOraSession");
db = session.OpenDatabase(Base,Login+"/"+Pass,);
Исключение
Сообщить(session.LastServerErrText);
КонецПопытки;
Возврат session.LastServerErr
КонецФункции
После того как подключились к базе попытаемся выполнить запрос к ней. Но для начала нужно установить параметры запроса если таковые имеются:
db.Parameters.Add (Ключ1, Значение1,1);
db.Parameters.Add (Ключ2, Значение2,1);
...
db.Parameters.Add (КлючN, ЗначениеN,1);
При установке параметров нужно учитывать следующее: при повторном запросе с параметрами к открытой базе может возникнуть исключительная ситуация, дабы этого не происходило при каждом запросе очищайте параметры:
Для й = 0 по db.Parameters.Count-1 Цикл
db.Parameters.Remove(0);
КонецЦикла;
Ну и наконец сам запрос к базе выглядит так:
oradynaset = db.CreateDynaset(ТекстЗапроса,);
Пример функции которая записывает результат запроса в Таблицу значений :
Функция ЗапросКOracle(ТекстЗапроса,Параметры=Неопределено)
Если Параметры <> Неопределено Тогда
Для й = 0 по db.Parameters.Count-1 Цикл
db.Parameters.Remove(0);
КонецЦикла;
Для Каждого СтрПараметр Из Параметры Цикл
db.Parameters.Add (СтрПараметр.Ключ, СтрПараметр.Значение,1);
КонецЦикла;
КонецЕсли;
oradynaset = db.CreateDynaset(ТекстЗапроса,);
//Формируем структуру Таблицы значений из результата запроса
Тз = Новый ТаблицаЗначений;
ЧКТ = oradynaset.Fields.Count();
Для сч = 0 По ЧКТ-1 Цикл
Тз.Колонки.Добавить(Строка(oradynaset.Fields(сч).Name()));
КонецЦикла;
//Копируем в Таблицу значений строки результата запроса
й=1;
Пока (oradynaset.EOF=0) Цикл
СТЗ = Тз.Добавить();
Для сч = 0 По ЧКТ-1 Цикл
СТЗ[Строка(oradynaset.Fields(сч).Name())] = oradynaset.Fields(Строка(oradynaset.Fields(сч).Name())).Value;
КонецЦикла;
Состояние("загрузка данных в таблицу значений: "+й+" из "+oradynaset.RecordCount);й=й+1;
oradynaset.MoveNext();
КонецЦикла;
Возврат Тз
КонецФункции
Пример Процедуры которая использует выше описанные функции:
Процедура Выполнить()
// подключаемся к базе
Если ПодключитьсяКБазеOralce("ИмяБазы","Логин","Пароль") <> 0 Тогда
Возврат
КонецЕсли;
// задаем текст запроса (в данном случае извлекаем данные за определенный период)
ТекстЗапроса = "SELECT *
|FROM dbName.TableName
|WHERE DATE between To_Date(:DATE1,:DFormat) And To_Date(:DATE2,:DFormat)
|";
// задаем параметры
Параметр1=Дата1;
Параметр2=Дата2;
Параметр3="'yyyy.mm.dd hh24:mi:ss'";
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("DATE1",Параметр1);
ПараметрыЗапроса.Вставить("DATE2",Параметр2);
ПараметрыЗапроса.Вставить("DFormat",Параметр3);
// выполняем запрос
Таблица = ЗапросКOracle(ТекстЗапроса,ПараметрыЗапроса)
КонецПроцедуры
И на последок. Не забудьте что формат дат в 1С и ORACLE разный, поэтому дату до передачи в параметр нужно форматировать,
привести к виду: yyyy.mm.dd hh24:mi:ss
P.S. У кого есть дополнения пишите, давайте расширим материал