Работа с СУБД Oracle через интерфейс OCCI
ОГЛАВЛЕНИЕ
Принятые именования объектов
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 не рассматриваются, предлагаю обратиться к документации за информацией по этим объектам.