Встроенный SQL
OCCI-интерфейс для Oracle
Кроме использования встроенного SQL, реализующего унифицированный стандартный механизм доступа к любым базам данных из практически любых языков программирования, существуют механизмы, ориентированные на конкретные базы данных и на конкретные языки программирования. Одним из таких механизмов является OCCI-интерфейс для работы с СУБД Oracle.
OCCI-интерфейс (Oracle C++ Call Interface) - это API, предоставляющее разработчику приложений С++ средства доступа к базе данных Oracle, включающие методы подключения к базе данных, методы для получения метаданных и методы для извлечения и изменения данных.
OCCI-интерфейс обеспечивает высокую производительность выполняемых приложений за счет эффективного использования памяти и сетевого взаимодействия. Дополнительно OCCI-интерфейс предоставляет развитый набор средств для доступа приложения-клиента к объектам базы данных, а также для идентификации пользователей, включая многоуровневую идентификацию.
OCCI-интерфейс реализован как динамическая библиотека, которая может быть загружена при выполнении приложения-клиента.
Эти элементы необходимы для неявного встраивания операторов SQL или PL/SQL в основной язык программирования.
На следующей схеме представлен процесс получения выполнимого приложения с использованием OCCI-библиотеки.
Приведем пример приложения на языке С++, использующего OCCI-библиотеку для реализации операций вставки, извлечения данных, изменения и удаления данных.
Пример:
#include <iostream.h> #include <occi.h> // Библиотека располагается // в каталоге [ORACLE_HOME]\oci\include using namespace oracle::occi; // Для доступа к пространству имен occi using namespace std; class occi_select { private: Environment *env; // Переменная окружения Connection *conn; // Переменная соединения Statement *stmt; // Переменная оператора public: occi_select (string user, string passwd, string db) // Конструктор { // Соединение с БД env = Environment::createEnvironment (Environment::DEFAULT); conn = env->createConnection (user, passwd, db); } ~occi_select () // Деструктор { env->terminateConnection (conn); // Освобождение соединения Environment::terminateEnvironment (env); } // Добавление строки с динамическим связыванием void insertRowBind(int c1, string c2) { string sqlStmt = "INSERT INTO tbl1 VALUES (:x, :y)"; stmt=conn->createStatement (sqlStmt); try{ stmt->setInt (1, c1); // Определение значения для первого столбца stmt->setString (2, c2); stmt->executeUpdate (); }catch(SQLException ex) { cout<<ex.getMessage() << endl; } conn->terminateStatement (stmt); // Освобождение оператора } // Добавление строки в таблицу void insertRow () { string sqlStmt = "INSERT INTO tbl1 VALUES (6, 'ABC')"; stmt = conn->createStatement (sqlStmt); try{ stmt->executeUpdate (); }catch(SQLException ex) { cout<<ex.getMessage() << endl; } conn->terminateStatement (stmt); } // Изменение строки void updateRow (int c1, string c2) { string sqlStmt = "UPDATE tbl1 SET f1 = :x WHERE f2 = :y"; stmt = conn->createStatement (sqlStmt); try{ stmt->setString (1, c2); stmt->setInt (2, c1); stmt->executeUpdate (); }catch(SQLException ex) { cout<<ex.getMessage() << endl; } conn->terminateStatement (stmt); } // Удаление строки void deleteRow (int c1, string c2) { string sqlStmt = "DELETE FROM tbl1 WHERE f1= :x AND f2 = :y"; stmt = conn->createStatement (sqlStmt); try{ stmt->setInt (1, c1); stmt->setString (2, c2); stmt->executeUpdate (); }catch(SQLException ex) { cout<<ex.getMessage() << endl; } conn->terminateStatement (stmt); } // Отображение всех строк void displayResultSet () { string sqlStmt = "SELECT f1, f2 FROM tbl1"; stmt = conn->createStatement (sqlStmt); ResultSet *rs = stmt->executeQuery (); try{ while (rs->next ()) { cout << "f1: " << rs->getInt (1) << " f2: " << rs->getString (2) << endl; } }catch(SQLException ex) { cout<<"Error number: "<< ex.getErrorCode() << endl; cout<<ex.getMessage() << endl; } stmt->closeResultSet (rs); // Освобождение результирующего набора conn->terminateStatement (stmt); } }; // Конец кода класса occi_select int main (void) { string user = "SCOTT"; string passwd = "TIGER"; string db = ""; occi_select *occi1 = new occi_select (user, passwd, db); occi1-> displayResultSet (); // Отображение всех записей occi1->insertRow (); // Вставка строки occi1-> displayResultSet (); occi1->insertRowBind(6, "ABC"); // Вставка строки с использованием // динамического связывания occi1-> displayResultSet (); occi1->deleteRow (6, "ABC"); // Удаление строки occi1->updateRow (4, "EEE"); // Обновление строки occi1-> displayResultSet (); delete (occi1); // Освобождение OCCI-объекта }Листинг 9.1.