| Россия, г. Ростов - на - Дону |
Встроенный 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.
