ヘッダーをスキップ
Oracle C++ Call Interfaceプログラマーズ・ガイド
11g リリース1(11.1)
E05674-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

1 OCCIの概要

この章では、Oracle C++ Call Interface(OCCI)の概要を説明し、OCCIの説明で使用される特別な用語を示します。Oracle環境で実行するC++アプリケーションの開発に必要な基本情報が提供されます。

ここでは、次の項目について説明します。

OCCIの概要

Oracle C++ Call Interface(OCCI)は、Application Program Interface(API)の1つです。OCCIを使用すると、C++言語で作成したアプリケーションからOracleデータベース内のデータにアクセスできます。OCCIによって、C++のプログラマは、SQL文の処理やオブジェクト操作などのOracleデータベース操作をすべて実行できます。

OCCIを使用すると、次の内容を実現できます。

OCCIには、標準的なデータベースのアクセス関数と検索関数のライブラリが、実行時にC++アプリケーションにリンクできるように、動的ランタイム・ライブラリ(OCCIクラス)の形で用意されています。このため、第三世代言語(3GL)プログラム内にSQLやPL/SQLを埋め込む必要はありません。

OCCIの利点

Oracleデータベースにアクセスする場合、OCCIには次のような大きな利点があります。

  • C++およびオブジェクト指向プログラミング・パラダイムを有効に活用できます。

  • 使用が容易です。

  • JDBCの知識がある場合は容易に習得できます。

  • ナビゲーショナル・インタフェースによって、ユーザー定義型のデータベース・オブジェクトをC++クラス・インスタンスとして操作できます。

OCCIでは非ブロック化モードがサポートされない点に注意してください。

OCCIアプリケーションの構築

図1-1に示すように、OCCIプログラムはデータベースを使用しないアプリケーションと同じ方法でコンパイルおよびリンクできます。

図1-1 OCCIの開発過程

図1-1の説明は次にあります。
「図1-1 OCCIの開発過程」の説明

Oracleでは、一般に普及しているほとんどのサード・パーティのコンパイラをサポートしています。OCCIプログラムのリンクの詳細は、システムによって異なります。一部のプラットフォームでは、OCCIプログラムを正常にリンクさせるために、OCCIライブラリに加えて他のライブラリの組込みが必要になる場合があります。


関連項目:


使用しているプラットフォームでのOCCIアプリケーションのコンパイルとリンクの詳細は、使用オペレーティング・システムに関するOracleマニュアルと『Oracle Databaseインストレーション・ガイド』を参照してください。

OCCIの機能

OCCIは、次の機能を備えています。

  • 多数のユーザーを安全にサポートできる、スケーラブルなマルチスレッド・アプリケーションを設計するためのAPI

  • データベースの接続管理、SQL文の処理およびOracleデータベース・サーバーから取り出したオブジェクトの操作を行うためのSQLアクセス関数

  • Oracle型のデータ属性を操作するためのデータ型マッピングおよび操作関数

  • メッセージ管理に対応するアドバンスト・キューイング

  • 分散トランザクション・サポートのためのXA準拠

  • SQLおよびPL/SQL問合せの文キャッシュ

  • 複数の接続を管理するための接続プーリング

  • 国際および地域言語要件にあわせてアプリケーションをカスタマイズするためのグローバリゼーションおよびUnicodeのサポート

  • オブジェクト型トランスレータ・ユーティリティ

  • 透過的アプリケーション・フェイルオーバーのサポート

手続き型および非手続き型要素

OCCIを使用すると、SQLの非手続き型データ・アクセス機能と、C++の手続き型機能を併せ持つ、複数層アーキテクチャ上のスケーラブルなマルチスレッド・アプリケーションを開発できます。

非手続き型言語のプログラムでは、操作対象となる一連のデータが指定されますが、実行する操作の種類や操作の方法は指定されません。SQLは非手続き型という性質上、習得しやすく、データベース・トランザクションを実行しやすい言語です。また、SQLは、先進のリレーショナル・データベース・システムおよびオブジェクト・リレーショナル・データベース・システムのデータに対するアクセスや操作に使用する標準言語となっています。

手続き型言語のプログラムでは、ほとんどの文の実行が、前または後続の文、およびループや条件ブランチなどSQLでは利用できない制御構造に依存しています。手続き型という性質上、このような言語はSQLよりも複雑ですが、柔軟性に富み、効果的に使用できます。

OCCIプログラムでは、非手続き型言語と手続き型言語の要素が組み合されているため、構造化プログラミング環境でOracleデータベースに容易に接続できます。

OCCIでは、Oracleデータベース・サーバーを通じて使用できる、SQLのデータ定義、データ操作、問合せおよびトランザクション制御の機能をすべてサポートしています。たとえば、OCCIプログラムでは、Oracleデータベースに対する問合せを実行できます。問合せ文では入力(バインド)変数を使用して、データベースにデータを渡すようにプログラムに対して指示できます。たとえば、次のとおりです。

SELECT name FROM employees WHERE employee_id = :empnum

このSQL文のempnumは、アプリケーションが指定する値に対するプレースホルダです。

また、OCCIアプリケーションでは、Oracleが開発したSQLの手続き型拡張要素であるPL/SQLも使用できます。PL/SQLを使用すると、SQLのみで作成されたアプリケーションよりも、さらに効果的で柔軟性のあるアプリケーションを開発できます。OCCIでは、Oracleデータベース・サーバー内のオブジェクトに対するアクセスおよび操作のための機能も提供します。

SQL文の処理

OCCIアプリケーションの主なタスクの1つは、SQL文を処理することです。SQL文の種類が異なると、プログラムでは異なる処理ステップが必要になります。OCCIアプリケーションをコーディングする際には、このことを考慮に入れることが重要です。Oracleでは、次の種類のSQL文を認識します。

DDL文

DDL文は、データベース内のスキーマ・オブジェクトを管理します。DDL文は、新規の表を作成し、古い表を削除し、その他のスキーマ・オブジェクトを設定します。また、スキーマ・オブジェクトに対するアクセスを制御します。例1-1には表の作成方法、例1-2にはこの表に関する権限の付与と取消しの方法を示します。

例1-1 表の作成

CREATE TABLE employee_information (
   employee_id NUMBER(6),
   ssn NUMBER(9),
   dependents NUMBER(1),
   mail_address VARCHAR(60))

例1-2 表に対するアクセスの指定

GRANT UPDATE, INSERT, DELETE ON employee_information TO donna
REVOKE UPDATE ON employee_information FROM jamie

DDL文によって、Oracleデータベース内のオブジェクトを操作することもできます。例1-3では、オブジェクト表の作成方法を示しています。

例1-3 オブジェクト表の作成

CREATE TYPE person_info_type AS OBJECT (
   employee_id NUMBER(6),
   ssn NUMBER(9),
   dependents NUMBER(1),
   mail_address VARCHAR(60))

CREATE TABLE person_info_table OF person_info_type

制御文

OCCIアプリケーションでは、トランザクション制御文、接続制御文およびシステム制御文(DML文など)を処理します。


関連項目:


制御文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

DMLのSQL文

DML文は、データベース表にあるデータを変更できます。たとえば、DML文を使用して次の処理を実行します。

  • 表に新しい行を挿入します。

  • 既存の行の列値を更新します。

  • 表から行を削除します。

  • データベース内の表をロックします。

  • SQL文の実行計画を説明します。

DML文では、入力バインド変数を使用して、データベースにデータを渡すようにアプリケーションに対して指示できます。例1-4に例を示します。異なるバインド値を使用して、この文を複数回実行することも、配列を挿入して、サーバーとの1回のラウンドトリップで複数の行を追加することもできます。

例1-4 入力バインド変数を使用したデータの挿入

INSERT INTO departments VALUES(:1,:2,:3)

また、DML文では、Oracleデータベース内のオブジェクトを操作できます。例1-5は、オブジェクト表への特定の型のインスタンスの挿入を示しています。

例1-5 Oracle Databaseへのオブジェクトの挿入

INSERT INTO person_info_table
VALUES (person_info_type('450987','123456789','3','146 Winfield Street'))

問合せ

問合せは、データベースの表からデータを取り出すための文です。1つの問合せで、0、1行および複数行のデータを戻すことができます。すべての問合せは、例1-6のように、SQLキーワードSELECTで始まります。

例1-6 単純なSELECT文の使用

SELECT department_name FROM departments
   WHERE department_id = 30

例1-7のように、問合せ文では入力バインド変数を使用して、データベース・サーバーにデータを渡すようにプログラムに対して指示できます。

例1-7 入力変数によるSELECT文の使用

SELECT first_name, last_name
   FROM employees
   WHERE employee_id = :emp_id

このSQL文のemp_idは、アプリケーションが指定する値に対するプレースホルダです。

PL/SQLの概要

PL/SQLは、Oracleが開発したSQL言語の手続き型拡張要素です。PL/SQLは、単純な問合せやSQLデータ操作言語文よりも複雑なタスクを処理します。PL/SQLを使用すると、多数の構文を単一のブロックにグループ化し、1つの単位として実行できます。たとえば、次のような構文があります。

OCCIプログラムからPL/SQLストアド・プロシージャをコールし、OCCIプログラムのPL/SQLブロックを使用すると、次のタスクを実行できます。

PL/SQLプロシージャまたはファンクションは、出力変数を戻すこともできます。この出力変数はOUTバインド変数と呼ばれます。例1-8のとおりです。

例1-8 PL/SQLを使用した出力変数の取得

GET_EMPLOYEE_NAME(:1, :2);

この例の最初のパラメータは、従業員のID番号を指定する入力変数です。2番目のパラメータはOUTバインド変数で、従業員名の戻り値が格納されます。

PL/SQLを使用し、特定の従業員番号をキーにして、従業員表から値を取り出すSQL文を発行することもできます。例1-9は、PL/SQL文でのプレースホルダの使用方法も示しています。

例1-9 PL/SQLを使用した一部のレコードのプレースホルダへの挿入

SELECT last_name, first_name, salary, commission_pct
   INTO :emp_last, :emp_first, :sal, :comm
   FROM employees
   WHERE employee_id = :emp_id;

この文のプレースホルダは、PL/SQL変数ではありません。これらは、文の処理時にデータベース・サーバーとの間で受渡しを行う入力パラメータと出力パラメータを示しています。これらのプレースホルダはプログラムで指定する必要があります。

OCCI/SQLの特殊用語

このマニュアルでは、SQL文の様々な部分を参照するために特殊な用語を使用しています。例1-10で説明します。

例1-10 SQLを使用した一部のレコードの抽出

SELECT first_name, last_name, email
   FROM employees
   WHERE department_id = 80
   AND commission_pct > :base;

このSQL文は、次の部分で構成されています。

OCCIアプリケーションを開発する際は、プログラム中の入出力変数の値、またはこれを参照する値をデータベース・サーバーに指定しているルーチンをコールします。このマニュアルでは、データ用のプレースホルダ変数を指定することをバインド操作と呼びます。入力変数を指定する場合は、INバインド操作と呼びます。出力変数を指定する場合は、OUTバインド操作と呼びます。

オブジェクトのサポート

OCCIには、オブジェクト型オブジェクトを処理する機能があります。オブジェクト型は、ユーザー定義のデータ構造体で、実社会のエンティティを抽象的に表します。たとえば、データベースにperson(個人)というオブジェクトの定義が含まれているとします。このオブジェクト型は、個人を識別するための特徴を表した属性first_namelast_nameageなど)を持つことができます。

オブジェクト型の定義は、オブジェクト型のインスタンスを表すオブジェクトの作成の基礎となります。オブジェクト型を構造的な定義として使用すると、たとえば、personオブジェクトを属性JohnBoniventoおよび30を持つように作成できます。オブジェクト型にはメソッド、つまりそのオブジェクト型の動作を表すプログラム関数を含めることもできます。

OCCIは、Oracleデータベース・サーバーのオブジェクト機能を使用するプログラマに、包括的なAPIを提供します。その機能は、次の5つの主要なカテゴリに分類できます。

クライアント側オブジェクト・キャッシュ

オブジェクト・キャッシュは、オブジェクトに対する参照とメモリー管理をサポートするクライアント側のメモリー・バッファです。オブジェクト・キャッシュでは、OCCIアプリケーションがサーバーからクライアント側にフェッチしたオブジェクトを格納し、追跡します。クライアント側オブジェクト・キャッシュは、OCCI環境をobjectモードで初期化するときに作成されます。同じサーバーに対して実行中の複数のアプリケーションには、それぞれ専用のオブジェクト・キャッシュがあります。クライアント側オブジェクト・キャッシュでは、現在メモリーにあるオブジェクトの追跡、オブジェクトへの参照のメンテナンス、自動オブジェクト・スワッピングの管理およびオブジェクトのメタ属性または型情報の追跡が行われます。クライアント側オブジェクト・キャッシュには、次の利点があります。

  • アプリケーションのパフォーマンスの改善。オブジェクトのフェッチおよび操作に必要なクライアント/サーバー間のラウンドトリップ回数を減らします。

  • 拡張性の向上。クライアント側キャッシュからオブジェクト・スワッピングをサポートします。

  • 同時実行性の向上。オブジェクト・レベルのロックをサポートします。

  • キャッシュしきい値を超えた場合の自動ガベージ・コレクション。

オブジェクト用のランタイム環境

OCCIは、オブジェクト用のランタイム環境を提供します。このランタイム環境では、Oracleオブジェクトのクライアント側での使用方法を管理する一連のメソッドを使用できます。これらのメソッドは、次のタスクの実行に必要な機能を提供します。

  • オブジェクト機能へのアクセスのためのOracleデータベース・サーバーへの接続

  • クライアント側オブジェクト・キャッシュの割当ておよびそのパラメータのチューニング

  • エラーおよび警告メッセージの取得

  • データベース内のオブジェクトにアクセスするトランザクションの制御

  • SQLによるオブジェクトへの連想アクセス

  • パラメータまたは結果がOracleオブジェクト型であるPL/SQLプロシージャまたはファンクションの記述

連想アクセス用インタフェースおよびナビゲーショナル・アクセス用インタフェース

OCCIを使用したアプリケーションでは、次のような様々な種類のインタフェースを通じて、データベース内のオブジェクトにアクセスできます。

  • SQLのSELECT文、INSERT文およびUPDATE文。

  • C++ポインタと参照。対応する参照をたどってクライアント側のオブジェクト・キャッシュ内のオブジェクトにアクセスします。

OCCIには、SQLのSELECT文、INSERT文およびUPDATE文を使用してオブジェクトを操作するための一連のメソッドが用意されています。Oracleオブジェクトにアクセスする場合、これらのSQL文では、リレーショナル表にアクセスするような一貫した一連のステップが使用されます。OCCIが提供するメソッドでは、次の目的のためにSQL文を使用してオブジェクトにアクセスします。

  • SQL文やPL/SQLストアド・プロシージャの入出力変数として、オブジェクト型のインスタンスと参照をバインドします。

  • オブジェクト型のインスタンスと参照を含むSQL文を実行します。

  • オブジェクト型のインスタンスと参照をフェッチします。

  • 結果セットから列の値をオブジェクトとして取得します。

  • Oracleオブジェクト型の選択リスト項目を記述します。

OCCIにはオブジェクトをナビゲートするためのシームレスなインタフェースが用意されているため、一時C++オブジェクトを操作する場合と同様に、データベース・オブジェクトを操作できます。オブジェクト参照上のオーバーロードされた矢印()演算子を間接参照すると、オブジェクトをデータベースから取り出して、アプリケーション領域で透過的に使用できます。

メタデータ・クラス

OCCIでは、各Oracleデータ型がC++クラスで表現されます。このクラスは、データ型の動作と特性をオーバーロードされた演算子とメソッドによって公開します。たとえば、Oracleデータ型NUMBERは、Numberクラスで表現されます。

OCCIは、メタデータ・クラスを提供します。このメタデータ・クラスを使用すると、オブジェクト型を含むデータベース・オブジェクトを記述するメタデータを取得できます。

オブジェクト型トランスレータ・ユーティリティ

オブジェクト型トランスレータ(OTT)ユーティリティは、Oracleオブジェクト型のスキーマ情報をクライアント側の言語バインドに変換します。つまり、OTTはオブジェクト型情報を構造体やクラスなどのホスト言語変数の宣言に変換します。OTTは、Oracleデータベース・スキーマ・オブジェクトの情報が含まれるintypeファイルを入力として使用します。次にouttypeファイルおよび必要なヘッダー・ファイルと実装ファイルを生成します。このファイルは、オブジェクト・スキーマに対して実行するC++アプリケーションにインクルードする必要があります。

要約すると、OCCIでは、次の方法によるOracleデータベース内のオブジェクト処理をサポートしています。

  • アプリケーション開発者の生産性の向上。スキーマ・オブジェクトに対応するホスト言語変数を記述する必要がなくなります。

  • データ定義言語の選択肢としてのSQLの保持。SQLで作成したOracleデータベース・スキーマ・オブジェクトをホスト言語変数に自動的にマップできるため、Oracleによって、ユーザー・データの一貫したモデルを企業全体でサポートできます。

  • オブジェクト型のスキーマ展開が可能。スキーマが変更されたときにインクルード・ヘッダー・ファイルが再生成されるため、Oracleアプリケーションでスキーマ展開がサポートされます。

  • オブジェクト・データとスキーマ情報を操作するSQL文の実行。

  • SQL文の入力変数としての、オブジェクト参照およびオブジェクト・インスタンスの受渡し。

  • SQL文の出力を受け取る変数としての、オブジェクト参照およびオブジェクト・インスタンスの宣言。

  • データベースからのオブジェクト参照およびオブジェクト・インスタンスのフェッチ。

  • オブジェクトのインスタンスおよび参照を戻すSQL文のプロパティの記述。

  • オブジェクト・パラメータまたは結果を含むPL/SQLプロシージャまたはファンクションの記述。

  • オブジェクト機能およびリレーショナル機能を同期化するための、コミット・コールとロールバック・コールの拡張。

  • オブジェクトのアドバンスト・キューイング。

OTTは通常、コマンドラインからintypeファイル、outtypeファイルおよび特定のデータベース接続を指定することにより起動されます。