Московский государственный университет имени М.В.Ломоносова
Опубликован: 05.01.2004 | Доступ: свободный | Студентов: 9474 / 1246 | Оценка: 4.04 / 3.84 | Длительность: 10:03:00
ISBN: 978-5-94774-539-9
Лекция 9:

Встроенный SQL

< Лекция 8 || Лекция 9: 123 || Лекция 10 >

OCCI-интерфейс для Oracle

Кроме использования встроенного SQL, реализующего унифицированный стандартный механизм доступа к любым базам данных из практически любых языков программирования, существуют механизмы, ориентированные на конкретные базы данных и на конкретные языки программирования. Одним из таких механизмов является OCCI-интерфейс для работы с СУБД Oracle.

OCCI-интерфейс (Oracle C++ Call Interface) - это API, предоставляющее разработчику приложений С++ средства доступа к базе данных Oracle, включающие методы подключения к базе данных, методы для получения метаданных и методы для извлечения и изменения данных.

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

OCCI-интерфейс реализован как динамическая библиотека, которая может быть загружена при выполнении приложения-клиента.

Эти элементы необходимы для неявного встраивания операторов SQL или PL/SQL в основной язык программирования.

На следующей схеме представлен процесс получения выполнимого приложения с использованием OCCI-библиотеки.

Процесс получения выполнимого приложения с использованием OCCI-библиотеки.

Рис. 9.2. Процесс получения выполнимого приложения с использованием 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.
< Лекция 8 || Лекция 9: 123 || Лекция 10 >