gifts2017

Пример работы с Oracle через OracleInProcServer

Опубликовал sckif (sckif) в раздел Программирование - Практика программирования

В данной статье рассматривается пример работы с СУБД Oracle через OracleInProcServer.

Существуют 2 способа соединения с базой Oracle:

1) Через ODBC (Open DataBase Connectivity)

2) Через OOO4O (Oracle Objects for OLE)

 

Небольшое отступление касаемо их отличий.

Что такое ODBC?

ОDBC - это стандартизованное API, разработанное по спецификации SQL Access Group, которое
позволяет соединяться с любой базой данных, поддерживающей SQL. В нем определен стандартный
набор функций, кодов ошибок и типов данных, которые можно использовать для разработки приложений,
независимо от базы данных. Обычно, ODBC используется, если требуется независимость от базы данных,
или осуществляется работа с разными источниками данных.

Основные преимущества:

  1. Простота работы с ним
  2. Входит в поставку ОС Windows

Недостатки:

  1. (Главное) Не поддерживает большинства расширений Oracle
  2. Производительность ниже чем у OOO4O

Что такое Oracle Objects for OLE (OO4O)?

OO4O – это средство доступа к БД, базирующееся на COM, позволяющее получать, оптимизированный доступ к БД Oracle. 
Входит в поставку Oracle и открывает перед разработчиками доступ ко всем возможностям предоставляемым БД Oracle.

Основные преимущества: 

  1. Полная поддержка координатора транзакций в Microsoft Transaction Server (MTS)
  2. (Главное) Простой доступ к переменным и объектам специализированных типов данных реализованных в Oracle, включая:
    1. Object References (REFs – ссылочный тип)
    2. Object Instances (Objects – объектный тип)
    3. Nested Tables (Вложенные таблицы)
    4. Varrays (Массивы переменной длины)
    5. BLOBs, CLOBs, NCLOBs and BFILEs
  3. Поддержка параметров типа курсор (это единственный способ возвратить результат выполнения оператора SELECT (Resultset) из PL/SQL-блока или хранимых PL/SQ-процедур)
  4. Полный доступ к возможностям Oracle Advanced Queuing
  5. Эффективное управление подключениями к БД и пользовательскими сессиями (connection pooling и multiplexing)
  6. Большая производительность

Недостатки: Необходимо установить клиент 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. У кого есть дополнения пишите,  давайте расширим материал

Скачать файлы

Наименование Файл Версия Размер
ЗапросКOracle 52
.epf 6,70Kb
15.03.12
52
.epf 6,70Kb Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение

Комментарии

0. sckif (sckif) 15.04.12 10:13
В данной статье рассматривается пример работы с СУБД Oracle через OracleInProcServer.

Перейти к публикации

1. Игорь Исхаков (Ish_2) 15.04.12 10:13
Всё это хорошо. Но где же анализ ?
Сравнение с другими способами ? (ВнешниеИсточникиДанных,ADODB)
Зачем нам нужно такое соединение ? В чем его выигрыш ?
В клиент-серверном варианте я должен устанавливать клиента Oracle на каждом клиенте 1с Прелприятия ?
2. Равиль Бикбаев (BRT) 10.07.12 14:14
В моем случае такое соединение как раз пригодилось.
По факту такой способ позволяет формировать запросы с необходимыми параметрами.
Во вторых, у меня на части машин ODBC не работает.
Клиент Oracle необходим даже при ODBC коннекте.
Однозначно необходимая вещь.
3. Михаил Приходько (pri_hod) 18.07.12 19:03
валится на строке
session = Новый COMОбъект("OracleInProcServer.XOraSession");

все установил что только можно
{Форма.Форма.Форма(4)}: Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса: Недопустимая строка с указанием класса
4. sckif (sckif) 20.07.12 14:40
(3) pri_hod, он не видит класс OracleInProcServer.XOraSession, попробуй удалить и заново поставить клиент Oracle, если не поможет попробуй на другой машине, возможно винда моросит у тебя.
5. Михаил Приходько (pri_hod) 20.07.12 15:29
проблема в клиенте оракл. нужно использовать 32 битную версию
6. Артем Сотников (rago) 24.07.12 19:17
Зачем тут какие-то сравнения с другими способами подключения?
Вещь действительно необходимая. Я вот использую на данный момент такое же подключение к БД Oracle, только работаю через внешние источники данных (пришлось, конечно, попотеть, чтобы подключить БД - получилось только через клиента Oracle тот, который в Ora92 ставится)
7. JAKE (jake.cmlt@gmail.com) 10.09.12 14:27
Добрый день.
А что делать, если используется 64-разрядный сервер? Пробую - при создании COMОбъекта 1с рушится. 1с - файловая.
8. Роман Катунин (Rom_Kat) 03.04.13 15:58
добрый день.
При попытке подключения выдает ошибку ORA-12154: TNS:невозможно разрешить заданный идентификатор соединения
клиент версии 10. sqlplus подключается без проблем.
Не подскажете куда копать?
9. Равиль Бикбаев (BRT) 16.05.13 13:08
Затем сконфигурировать файл tnsnames.ora который находится в директории:
...\oracle\ora92\network\admin

В основном проблемы могут быть тут.
Сам провозился с подобной ошибкой неделю.
Снес "все" оракл настройки, заново сконфигурировал, не работало. При этом на другой машине где только что оракл поставили, завелась без проблем даже на 64 бит.
Проверка на работоспособность это обычная попытка ODBC подключения. В ней можно построить строку подключения и использовать ее.
В инете много статей по этому поводу.
10. freebsdd freebsdd (freebsdd) 05.09.13 09:27
Дополнение есть - Ввиду сложности полноценной настройки С НУЛЯ Оракла, не хватает добавить инструкцию по установке Oracle Objects for OLE и ODBC. Я работал всё время с MS SQL - просто прелесть, с "первой буквы", вышла нужда подключаться к базе Oracle с 1С, для меня это вышла большая ЖОПА, 3-ий день уже долблю долбанный ОРАКЛ, сотни вкладок, часы и тоны инфы (кто то неделю, кто 2 недели). Сложновато с нуля его, вот была бы путная статейка.
11. DenisCh Гейтс (DenisCh) 05.09.13 09:32
Я работал с ораклём через InstantClient'а - на 64 бит повозиться пришлось, но настроил в конце концов...
Там хитрости в наличии длл, путях (точнее расположении нужных каталогов в порядке указания путей) и настройке TNS
12. freebsdd freebsdd (freebsdd) 05.09.13 09:35
Установил ODAC 11.2, дела продвигаются, кстати, кто нибудь знает, при открытии этой обработки выдаёт сообщение: "Запуск программы невозможен, т.к. на компьютере отсутствует OCI.DLL..." Запускается терминально на Сервере, OCI.DLL Закинул уже и в System32 и в папку 1c, есть у кого нибудь опыт борьбы с этим?
13. freebsdd freebsdd (freebsdd) 05.09.13 09:43
(11) DenisCh, Оо, а какие хитрости?
14. DenisCh Гейтс (DenisCh) 05.09.13 09:49
(13) freebsdd, минимальный клиент не содержит каких-то длл (их я искал через depence browser), пути к бинам должны быть первыми в переменной Path, ну и правильно настроить TNS - но это меньшая из всех проблем...
15. freebsdd freebsdd (freebsdd) 05.09.13 11:12
(14) DenisCh, а правильно настроить TNS, это только файл tnsnames.ora или ещё что то?
16. DenisCh Гейтс (DenisCh) 05.09.13 12:18
(15) freebsdd, он самый, насколько я помню...
17. freebsdd freebsdd (freebsdd) 05.09.13 12:35
(16) DenisCh, Вижу это давно было :))) Буду продолжать настраивать ДОракл! Спасибо Вам за советы!
18. Алексей Гафуров (Alex_grem) 09.02.14 22:11
Спасибо за статью, очень вовремя нашел!
19. Артём Рогов (ben_art) 18.11.14 11:27
Подскажите какой клиент лучше использовать и будьте так добры выложить его тут.)
20. sckif (sckif) 03.12.14 13:25
(19) ben_art, Качай с сайта Oracle, там он в свободном доступе есть.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа