この章では、Oracle C++ Call Interface (OCCI)の概要を説明し、OCCIの説明で使用される特別な用語を示します。Oracle環境で実行するC++アプリケーションの開発に必要な基本情報が提供されます。
ここでは、次の項目について説明します。
Oracle C++ Call Interface (OCCI)は、C++アプリケーションにOracle Databaseのデータへのアクセスを提供するアプリケーション・プログラミング・インタフェース(API)です。OCCIによって、C++プログラマは、SQL文の処理やオブジェクトの操作を含むOracle Database操作全体を利用できるようになります。
OCCIを使用すると、次の内容を実現できます。
システム・メモリーおよびネットワーク接続を効率的に使用することにより実現する、高パフォーマンスのアプリケーション
ユーザー数および要求数の増加に対応できるスケーラブルなアプリケーション
クライアント側によるOracleデータベース・オブジェクトへのアクセスなど、Oracleデータベース・オブジェクトを使用したアプリケーション開発に対する包括的なサポート
ユーザー認証およびパスワード管理の簡素化
n層認証
2層クライアント/サーバー環境または複数層環境での動的な接続管理およびトランザクション管理に適した、整合性のあるインタフェース
カプセル化されたインタフェースおよび不透明なインタフェース
OCCIには、標準的なデータベースのアクセス関数と検索関数のライブラリが、実行時にC++アプリケーションにリンクできるように、動的ランタイム・ライブラリ(OCCIクラス)の形で用意されています。このため、第三世代言語(3GL)プログラム内にSQLやPL/SQLを埋め込む必要はありません。
この項は、次の項目で構成されています。
Oracleデータベースにアクセスする場合、OCCIには次のような大きな利点があります。
C++およびオブジェクト指向プログラミング・パラダイムを有効に活用できます。
使用が容易です。
JDBCの知識がある場合は容易に習得できます。
ナビゲーショナル・インタフェースによって、ユーザー定義型のデータベース・オブジェクトをC++クラス・インスタンスとして操作できます。
OCCIでは非ブロック化モードがサポートされない点に注意してください。
図1-1に示すように、OCCIプログラムはデータベースを使用しないアプリケーションと同じ方法でコンパイルおよびリンクできます。
Oracleでは、一般に普及しているほとんどのサード・パーティのコンパイラをサポートしています。OCCIプログラムのリンクの詳細は、システムによって異なります。一部のプラットフォームでは、OCCIプログラムを正常にリンクさせるために、OCCIライブラリに加えて他のライブラリの組込みが必要になる場合があります。
関連項目: プラットフォーム固有のOCCIアプリケーションのコンパイルとリンクの詳細は、使用しているオペレーティング・システムに関するOracleドキュメントと『Oracle Databaseインストレーション・ガイド』を参照してください。 |
OCCIは、次の機能を備えています。
多数のユーザーを安全にサポートできる、スケーラブルなマルチスレッド・アプリケーションを設計するためのAPI
データベースの接続管理、SQL文の処理およびOracleデータベース・サーバーから取り出したオブジェクトの操作を行うためのSQLアクセス関数
Oracle型のデータ属性を操作するためのデータ型マッピングおよび操作関数
メッセージ管理に対応するアドバンスト・キューイング
分散トランザクション・サポートのためのXA準拠
SQLおよびPL/SQL問合せの文キャッシュ
複数の接続を管理するための接続プーリング
国際および地域言語要件にあわせてアプリケーションをカスタマイズするためのグローバリゼーションおよびUnicodeのサポート
オブジェクト型トランスレータ・ユーティリティ
透過的アプリケーション・フェイルオーバーのサポート
OCCIを使用すると、SQLの非手続き型データ・アクセス機能と、C++の手続き型機能を併せ持つ、複数層アーキテクチャ上のスケーラブルなマルチスレッド・アプリケーションを開発できます。
非手続き型言語のプログラムでは、操作対象となる一連のデータが指定されますが、実行する操作の種類や操作の方法は指定されません。SQLは非手続き型という性質上、習得しやすく、データベース・トランザクションを実行しやすい言語です。また、先進のリレーショナル・データベース・システムおよびオブジェクト・リレーショナル・データベース・システムのデータに対するアクセスや操作に使用する標準言語にもなっています。
手続き型言語のプログラムでは、ほとんどの文の実行が、前または後続の文、およびループや条件ブランチなどSQLでは利用できない制御構造に依存しています。手続き型という性質上、このような言語はSQLよりも複雑ですが、柔軟性に富み、効果的に使用できます。
OCCIプログラムでは、非手続き型言語と手続き型言語の要素が組み合されているため、構造化プログラミング環境でOracleデータベースに容易にアクセスできます。
OCCIでは、Oracleデータベース・サーバーを通じて使用可能なSQLのデータ定義、データ操作、問合せおよびトランザクション制御の機能をすべてサポートしています。たとえば、OCCIプログラムでは、Oracle Databaseに対する問合せを実行できます。この問合せで、次のように、入力(バインド)変数を使用してデータベースにデータを提供するようにプログラムに要求できます。
SELECT name FROM employees WHERE employee_id = :empnum
このSQL文のempnum
は、アプリケーションが指定する値に対するプレースホルダです。
また、OCCIアプリケーションでは、Oracleが開発したSQLの手続き型拡張要素であるPL/SQLも使用できます。PL/SQLを使用すると、SQLのみで作成されたアプリケーションよりも、さらに効果的で柔軟性のあるアプリケーションを開発できます。OCCIでは、Oracleデータベース・サーバー内のオブジェクトに対するアクセスおよび操作のための機能も提供します。
OCCIアプリケーションの主なタスクの1つは、SQL文を処理することです。SQL文の種類が異なると、プログラムでは異なる処理ステップが必要になります。OCCIアプリケーションをコーディングする際には、このことを考慮に入れることが重要です。Oracleでは、次の種類のSQL文を認識します。
データ定義言語(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では、オブジェクト表の作成方法を示しています。
OCCIアプリケーションでは、トランザクション制御文、接続制御文およびシステム制御文(DML文など)を処理します。
関連項目: 制御文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
データ操作言語(DML)文は、データベース表にあるデータを変更できます。たとえば、DML文は表への新規行の挿入、既存の行の列値の更新、表からの行の削除、データベース内の表のロックおよびSQL文の実行計画の説明を行います。
DML文では、例1-4のように、入力(バインド)変数を使用してデータベースにデータを提供するようにアプリケーションに要求できます。この文は異なるバインド変数を使用して複数回実行できますし、サーバーへの単一ラウンドトリップでの配列挿入を通じて複数の行を追加することもできます。
また、DML文では、Oracleデータベース内のオブジェクトを操作できます。例1-5は、オブジェクト表への特定の型のインスタンスの挿入を示しています。
PL/SQLは、Oracleが開発したSQL言語の手続き型拡張要素です。PL/SQLは、単純な問合せやSQLデータ操作言語文よりも複雑なタスクを処理します。PL/SQLを使用すると、複数の構文を単一のブロックにグループ化し、1つの単位として実行できます。たとえば、次のような構文があります。
1つまたは複数のSQL文
変数宣言
代入文
手続き型制御文(IF
...
THEN
...
ELSE
文とループ)
例外処理
OCCIプログラムからPL/SQLストアド・プロシージャをコールし、OCCIプログラムのPL/SQLブロックを使用すると、次のタスクを実行できます。
他のPL/SQLストアド・プロシージャおよびストアド・ファンクションのコール
手続き型制御文を複数のSQL文と結合し、1つの単位として実行
レコード、表、カーソルFORループ、例外処理などの特殊なPL/SQL機能へのアクセス
カーソル変数の使用
Oracleデータベース内のオブジェクトへのアクセスおよび操作
PL/SQLプロシージャまたはファンクションは、出力変数を戻すこともできます。例1-8に示すように、この変数はOUTバインド変数と呼ばれます。
この例の最初のパラメータは、従業員の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変数ではありません。これらは、文の処理時にデータベース・サーバーとの間で受渡しを行う入力パラメータと出力パラメータを示しています。これらのプレースホルダはプログラムで指定する必要があります。
このマニュアルでは、SQL文の様々な部分を参照するために特殊な用語を使用しています。例1-10で説明します。
例1-10 SQLを使用した一部のレコードの抽出
SELECT first_name, last_name, email FROM employees WHERE department_id = 80 AND commission_pct > :base;
この例は、次の部分で構成されています。
SQLコマンド: SELECT
3つの選択リスト項目: first_name
、last_name
およびemail
FROM
句の表名: employees
WHERE
句の2つの列名: department_id
およびcommission_pct
WHERE
句の数値入力値: 40
WHERE
句の入力(バインド)変数用のプレースホルダ: :base
OCCIアプリケーションを開発する際は、プログラム中の入出力変数の値、またはこれを参照する値をデータベース・サーバーに指定しているルーチンをコールします。このマニュアルでは、データ用のプレースホルダ変数を指定することをバインド操作と呼びます。入力変数を指定する場合は、INバインド操作と呼びます。出力変数を指定する場合は、OUTバインド操作と呼びます。
OCCIには、オブジェクト型とオブジェクトを処理する機能があります。オブジェクト型は、ユーザー定義のデータ構造体で、実社会のエンティティを抽象的に表します。たとえば、データベースにperson
(個人)というオブジェクトの定義が含まれているとします。このオブジェクト型は、個人を識別するための特徴を表した属性(first_name
、last_name
、age
など)を持つことができます。
オブジェクト型の定義は、オブジェクト型のインスタンスを表すオブジェクトの作成の基礎となります。オブジェクト型を構造的な定義として使用すると、たとえば、person
オブジェクトを属性John
、Bonivento
および30
を持つように作成できます。オブジェクト型にはメソッド、つまりそのオブジェクト型の動作を表すプログラム関数を含めることもできます。
OCCIは、Oracleデータベース・サーバーのオブジェクト機能を使用するプログラマに、包括的なAPIを提供します。その機能は、以降のトピックで説明する次の5つの主要なカテゴリに分類できます。
Oracle内部スキーマ情報をクライアント側の言語バインド変数にマッピングする、オブジェクト型トランスレータ(OTT)ユーティリティ
関連項目:
|
オブジェクト・キャッシュは、オブジェクトに対する参照とメモリー管理をサポートするクライアント側のメモリー・バッファです。オブジェクト・キャッシュでは、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アプリケーションは、OCCIクラス・インスタンスでgetOCI
xxx
()
メソッドをコールすることで、基礎となるOCIハンドルおよび記述子を取得できます。これらのハンドルは、OCI関数のコールに使用できます。
アプリケーションは、OCIハンドルでプロパティが変更された場合に、対応するOCCIインスタンスがそれを反映する場合と反映しない場合があることに注意する必要があります。
OCCIとOCI間のこの相互運用性は、アプリケーションがオブジェクト関連機能にOCI関数を使用する場合にはサポートされません。
OCCIでは、各Oracleデータ型がC++クラスで表現されます。このクラスは、データ型の動作と特性をオーバーロードされた演算子とメソッドによって公開します。たとえば、Oracleデータ型NUMBER
は、Number
クラスで表現されます。OCCIは、メタデータ・クラスを提供します。このメタデータ・クラスを使用すると、オブジェクト型を含むデータベース・オブジェクトを記述するメタデータを取得できます。
オブジェクト型トランスレータ(OTT)ユーティリティは、Oracleオブジェクトに関するスキーマ情報をクライアント側の言語バインディングに変換します。すなわち、OTTはオブジェクト型情報を構造体やクラスなどのホスト言語変数の宣言に変換します。OTTは、Oracle Databaseスキーマ・オブジェクトに関する情報が含まれるintype
ファイルを入力として取得します。OTTは、outtype
ファイルと、オブジェクト・スキーマに対して実行されるC++アプリケーションにインクルードする必要があるヘッダファイルと実装ファイルを生成します。
要約すると、OCCIでは、次の方法によるOracleデータベース内のオブジェクト処理をサポートしています。
アプリケーション開発者の生産性の向上。スキーマ・オブジェクトに対応するホスト言語変数を記述する必要がなくなります。
データ定義言語の選択肢としてのSQLの保持。SQLで作成したOracleデータベース・スキーマ・オブジェクトをホスト言語変数に自動的にマップできるため、Oracleによって、ユーザー・データの一貫したモデルを企業全体でサポートできます。
オブジェクト型のスキーマ展開が可能。スキーマが変更されたときにインクルード・ヘッダー・ファイルが再生成されるため、Oracleアプリケーションでスキーマ展開がサポートされます。
オブジェクト・データとスキーマ情報を操作するSQL文の実行。
SQL文の入力変数としての、オブジェクト参照およびオブジェクト・インスタンスの受渡し。
SQL文の出力を受け取る変数としての、オブジェクト参照およびオブジェクト・インスタンスの宣言。
データベースからのオブジェクト参照およびオブジェクト・インスタンスのフェッチ。
オブジェクトのインスタンスおよび参照を戻すSQL文のプロパティの記述。
オブジェクト・パラメータまたは結果を含むPL/SQLプロシージャまたはファンクションの記述。
オブジェクト機能およびリレーショナル機能を同期化するための、コミット・コールとロールバック・コールの拡張。
オブジェクトのアドバンスト・キューイング。
OTTは通常、コマンドラインからintypeファイル、outtypeファイルおよび特定のデータベース接続を指定することにより起動されます。
この項では、Oracle Databaseに付属のOCCIの例をビルドする方法と、追加リソースについて説明します。
『Oracle Database Examplesインストレーション・ガイド』の説明に従ってデモ・プログラムをインストールする必要があります。これらのデモの一部を本書で例として使用します。例をビルドするには、次の手順を参照してください。
デモ・ディレクトリに移動します。
Windowsでは、このディレクトリはORACLE_HOME
\rdbms\demo
です。
LinuxおよびUNIXでは、このディレクトリはORACLE_HOME
/rdbms/demo
です。
このディレクトリにファイルdemo_rdbms.mk
が含まれていることを確認します。
make
コマンドを使用してOCCIデモを作成します。
すべてのデモを同時に作成するには、次のパラメータを使用します。
make -f demo_rdbms.mk occidemos
1つのデモのみ作成するには、次のパラメータを使用します。
make -f demo_rdbms.mk demoname
1つのデモとオブジェクトを作成するには、次のパラメータを使用します。
make -f demo_rdbms.mk buildocci EXE=demoname OBJS=demoname.o
1つのデモと静的ライブラリを作成するには、次のパラメータを使用します。
make -f demo_rdbms.mk buildocci_static EXE=demoname OBJS=demoname.o
詳細は、demo_rdbms.mk
ファイルを参照してください。
フォーラム、ダウンロード、ホワイト・ペーパーなど、OCCIに関する追加情報は、http://www.oracle.com/technetwork/database/features/oci/index-090820.html
を参照してください。