Работа с СУБД 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 не рассматриваются, предлагаю обратиться к документации за информацией по этим объектам.