Программирование arrow Visual C++ arrow Работа с СУБД Oracle через интерфейс OCCI

Работа с СУБД Oracle через интерфейс OCCI

Оглавление

OCCI - расшифровывается как Oracle C++ Call Interface и представляет собой специализированное апи для работы с СУБД Oracle используя C++ что в общем то явствует из названия. Для использования необходимо подключить заголовочный файл "occi.h".

Принятые именования объектов

Environment* env;
Connection* conn;
Statement* stmt;
ResultSet* rs;
SQLException &sqlExcp;

Давайте рассмотрим пример небольшой тестовой программы использующей интерфейс OCCI:

#include 
#include "occi.h"
 
using namespace std;
using namespace oracle::occi;

#define db_user_name "test"
#define db_password "test"
#define db_conn_str "service"
 
main(int argc,char* argv[])
  {
  try
    {
    /*
    Создание среды управления памятью и ресурсами для объектов OCCI.
    Предполагается использование объектных расширений - Environment::OBJECT
    */
    Environment* env = Environment::createEnvironment(Environment::OBJECT);  
    /*
    Создание соединения с базой данных
    */
    Connection* conn = env->createConnection(db_user_name, db_password, db_conn_str);
    /*
    Работа с запросом
    */
    Statement* stmt = conn->createStatement("Select 1 from dual");
    /*
    Получение результатов запроса
    rs->getInt(номер_поля_начинается_единицы)
    */
    ResultSet *rs = stmt->executeQuery();
    int res = 0;
    while (rs->next())
          {
          res = rs->getInt(1);
          }
       /*
       Освобождение ресурсов  
       */
        stmt->closeResultSet(rs);
    env->terminateConnection(conn);
    Environment::terminateEnvironment(env);
    }
  catch(SQLException &sqlExcp)
    {
    cerr << sqlExcp.getErrorCode() << " " << sqlExcp.getMessage() << endl;
    }
  return 0;
  }

Сборка программы для Linux, обратите внимание на пути к заголовочным файлам (-I) и библиотекам (-L)

g++ -L/opt/oracle/product/9ir2/lib -I/opt/oracle/product/9ir2/rdbms/demo  -I/opt/oracle/product/9ir2/rdbms/public 
test.cpp -locci -lclntsh -o test 

Привожу потому что на собственном опыте убедился что этот момент может вызвать вопросы. Библиотеки требующиеся для сборки программы:

  • OCI Shared Library (libociei.so on Solaris and oraociei10.dll on Windows); correct installation of this file determines if you are operating in Instant Client mode
  • Client Code Library (libclnstsh.so.10.1 on Solaris and oci.dll on Windows)
  • Security Library (libnnz10.so on Solaris and orannzsbb10.dll on Windows)
  • OCCI Library (libocci.so.10.1 on Solaris and oraocci10.dll on Windows)

Более подробную информацию можно получить здесь: Instant client.
Рассмотрим базовые объекты используемые программой.

Environment - предназначен для создания среды управления памятью и ресурсами для других объектов OCCI. Объекты создаются в рамках среды, программа может иметь несколько сред, среда может иметь несколько соединений(даже к разным базам) или пулов соединений. Доступные режимы создания

enum Mode
  {
  DEFAULT = OCI_DEFAULT,
  OBJECT = OCI_OBJECT,
  SHARED = OCI_SHARED,
  NO_USERCALLBACKS = OCI_NO_UCB,
  THREADED_MUTEXED = OCI_THREADED,
  THREADED_UNMUTEXED = OCI_THREADED / OCI_ENV_NO_MUTEX
  };

Параметры:

  • OBJECT - использование объектных расширений Oracle напрямую в программе на C++. Через специальную утилиту возможно подключение к базе и создание прототипов объектов хранящихся в базе прямо в виде классов C++. Например этот режим необходим для работы объекта Date из состава OCCI.
  • SHARED - данные разных запросов(курсоров) используются повторно, т.е. экономится память и время выполнения.
  • THREADED_MUTEXED - для использования разными потоками(в многопоточном приложении) без применения синхронизации - она обеспечивается автоматически для Environment, Map, ConnectionPool, Connection.
  • THREADED_UNMUTEXED - синхронизацию должно обеспечить приложение.

Statement - создание курсора для выполнения запроса к базе, методы выполнения запросов:

  • execute: Выполнить любой не специфичный запрос
  • executeUpdate: Выполнение DML и DDL
  • executeQuery: Запрос в базу, предполагает возвращение результата

Позволяет выполнять не только SQL-выражения но и PL/SQL(обрамленный BEGIN/END;)

ResultSet и Connection не рассматриваются, предлагаю обратиться к документации за информацией по этим объектам.


 
Следующая статья »


  • Visual C++, Задача Майхилла для Microsoft Visual C++
    О синхронизации процессов в среде Windows. Задача Майхилла - еще один (наряду с задачей RS-триггера) пример решения нетривиальных проблем создания сложных систем. Справившись с ней, мы научимся организовывать взаимодействие параллельно работающих компонентов сложных программных комплексов в жестких условиях. ...
  • Visual C++, Использование ODBC в Visual C++
    Класс CDatabase представляет собой класс, который обеспечивает связь с источником данных. Под источником данных может пониматься как непосредсвенно файл, в котором находится таблица, например dBase, так и файл с многими таблицами, например Microsoft Access или сервер баз данных Oracle, MS SQL Server и т.д. Для связи с источником данных используется интерфейс ODBC. У данного класса есть папа в виде класса
  • Visual C++, Создание простого приложения с плагинами
    В этой статье описываются принципы и решения, применяемые при проектировании приложений, которые будут использовать внешние, динамически подключаемые, модули. Эта статья более ориентирована на тех, кто хочет использовать механизмы подключения/отключения функциональности приложения, наподобии механизма Aobe Photoshop или Far, а не просто многократного использования кода в разных приложениях....
  • Visual C++, Работа с 1C Предприятие из Visual C++
    В данной статье показано, как можно работать с 1С Предприятием из С++ с помощью OLE DB. Так же она будет интересна тем, кто не пользуется C++, но хочет узнать подробности "а как оно устроено внутри 1С". В данной статье речь пойдет об 1С Предприятии версии 7.7. Полагаю, что в версии 8 мало что изменилось. Предполагается, что читатель хотя бы чуть-чуть знаком с 1С Предприятием. Так же предполагается, что вы изучали официальное руководство 1С по вопросам OLE DB (часть вторая описани...
  • Visual C++, Как самому сделать plug-in к FAR на Visual C++
    Трудно найти человека, которые не знает или не использует Far - IMHO лучший клон NC для Windows. Кроме того, что это просто очень хороший файл менеджер, к нему есть огромное количество plug-in модулей. Plug-in модуль это DLL-файл, который вместо стандартных Windows функций по работе с монитором, клавиатурой и т.д. обращается к функциям Far-а. Far поддерживает весь набор функций для работы в текстовом режиме. Установка plug-in модуля происходит предельно просто - DLL файл и файлы данных коп...
  • Visual C++, Использование директивы #import в Visual C++
    В данной статье я попытаюсь объяснить то, как работает эта директива и привести несколько примеров её использования. Надеюсь, после этого вы тоже найдёте её полезной.  Директива #import введена в Visual C++, начиная с версии 5.0. Её основное назначение облегчить подключение и использование интерфейсов COM, описание которых реализовано в библиотеках типов....
  • Visual C++, Создание VxD на Visual C++ без ассемблерных модулей
    Виртуальные драйверы устройств (VxD) в Windows во многих случаях являются единственным «честным» способом обхода ограничений, установленных системой для приложений Win32: невозможности прямого доступа к портам ввода-вывода и служебной памяти, эффективной обработки аппаратных прерываний, использования сервисных функций существующих VxD и т.п. Кроме того, без VxD не обходится практически ни один полноценный драйвер физического или виртуального устройства....
  • Visual C++, Основы разработки прикладных виртуальных драйверов
    Как уже отмечалось ранее, виртуальные драйверы служат прежде всего для виртуализации аппаратуры, то есть для предоставления одновременно выполняемым задачам возможности совместного использования устройств компьютера. Измерительная или управляющая аппаратура, подключаемая к компьютеру с целью создания автоматизированной установки, вряд ли будет эксплуатироваться в многозадачном режиме, однако использование для ее управления виртуального драйвера может заметно сократить программные издержки ...