1 OCCIの概要
この章では、Oracle C++ Call Interface (OCCI)の概要を説明し、OCCIの説明で使用される特別な用語を示します。Oracle環境で実行するC++アプリケーションの開発に必要な基本情報が提供されます。
OCCIの概要
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を埋め込む必要はありません。
OCCIの利点について
Oracleデータベースにアクセスする場合、OCCIには次のような大きな利点があります。
-
C++およびオブジェクト指向プログラミング・パラダイムを有効に活用できます。
-
使用が容易です。
-
JDBCの知識がある場合は容易に習得できます。
-
ナビゲーショナル・インタフェースによって、ユーザー定義型のデータベース・オブジェクトをC++クラス・インスタンスとして操作できます。
OCCIでは非ブロック化モードがサポートされない点に注意してください。
OCCIでのC++アプリケーションのビルドについて
図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より複雑になりますが、非常に柔軟で強力でもあります。
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データベース・サーバー内のオブジェクトに対するアクセスおよび操作のための機能も提供します。
SQL文の処理について
データ定義言語文について
データ定義言語(DDL)文は、データベース内のスキーマ・オブジェクトを管理します。これらの文は、新規の表を作成し、古い表を削除し、その他のスキーマ・オブジェクトを設定します。また、スキーマ・オブジェクトに対するアクセスを制御します。例1-1には表の作成方法、例1-2にはこの表に関する権限の付与と取消しの方法を示します。
DDL文によって、Oracleデータベース内のオブジェクトを操作することもできます。例1-3では、オブジェクト表の作成方法を示しています。
例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
例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)文は、データベース表にあるデータを変更できます。たとえば、DML文は表への新規行の挿入、既存の行の列値の更新、表からの行の削除、データベース内の表のロックおよびSQL文の実行計画の説明を行います。
DML文では、例1-4のように、入力(バインド)変数を使用してデータベースにデータを提供するようにアプリケーションに要求できます。この文は異なるバインド変数を使用して複数回実行できますし、サーバーへの単一ラウンドトリップでの配列挿入を通じて複数の行を追加することもできます。
また、DML文では、Oracleデータベース内のオブジェクトを操作できます。例1-5は、オブジェクト表への特定の型のインスタンスの挿入を示しています。
例1-4 入力(バインド)変数を使用したデータの挿入
INSERT INTO departments VALUES(:1,:2,:3)
例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-7のように、問合せ文では入力(バインド)変数を使用して、データベース・サーバーにデータを渡すようにプログラムに対して指示できます。
このSQL文のemp_id
は、アプリケーションが指定する値に対するプレースホルダです。
例1-6 単純なSELECT文の使用
SELECT department_name FROM departments WHERE department_id = 30
例1-7 入力変数によるSELECT文の使用
SELECT first_name, last_name FROM employees WHERE employee_id = :emp_id
PL/SQLの概要
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文でのプレースホルダの使用方法も示しています。
この文のプレースホルダは、PL/SQL変数ではないことに注意してください。これらは、文の処理時にデータベース・サーバーとの間で受渡しを行う入力パラメータと出力パラメータを示しています。これらのプレースホルダはプログラムで指定する必要があります。
例1-8 PL/SQLを使用した出力変数の取得
GET_EMPLOYEE_NAME(:1, :2);
例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;
OCCI/SQLの特殊用語について
このマニュアルでは、SQL文の様々な部分を参照するために特殊な用語を使用しています。例1-10で説明します。
この例は、次の部分で構成されています。
-
SQLコマンド:
SELECT
-
3つの選択リスト項目:
first_name
、last_name
およびemail
-
FROM
句の表名:employees
-
WHERE
句の2つの列名:department_id
およびcommission_pct
-
WHERE
句の数値入力値:40
-
WHERE
句の入力(バインド)変数用のプレースホルダ::base
OCCIアプリケーションを開発する際は、プログラム中の入出力変数の値、またはこれを参照する値をデータベース・サーバーに指定しているルーチンをコールします。このマニュアルでは、データ用のプレースホルダ変数を指定することをバインド操作と呼びます。入力変数を指定する場合は、INバインド操作と呼びます。出力変数を指定する場合は、OUTバインド操作と呼びます。
例1-10 SQLを使用した一部のレコードの抽出
SELECT first_name, last_name, email FROM employees WHERE department_id = 80 AND commission_pct > :base;
オブジェクトのサポートについて
OCCIには、オブジェクト型とオブジェクトを処理する機能があります。オブジェクト型は、ユーザー定義のデータ構造体で、現実社会の実体を抽象的に表します。たとえば、データベースにperson
(個人)というオブジェクトの定義が含まれているとします。このオブジェクト型は、個人を識別するための特徴を表した属性(first_name
、last_name
、age
など)を持つことができます。
オブジェクト型の定義は、オブジェクト型のインスタンスを表すオブジェクトの作成の基礎となります。オブジェクト型を構造的な定義として使用すると、たとえば、person
オブジェクトを属性John
、Bonivento
および30
を持つように作成できます。オブジェクト型には、メソッド、つまりそのオブジェクト型の動作を表すプログラム関数を含めることもできます。
関連項目:
-
『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』で、オブジェクト型とオブジェクトの詳細を参照してください
クライアント側のオブジェクト・キャッシュについて
オブジェクト・キャッシュは、オブジェクトの参照とメモリー管理をサポートするクライアント側のメモリー・バッファです。オブジェクト・キャッシュでは、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++オブジェクトを操作する場合と同様に、データベース・オブジェクトを操作できます。オブジェクト参照上のオーバーロードされた矢印(→
)演算子を間接参照すると、オブジェクトをデータベースから取り出して、アプリケーション領域で透過的に使用できます。
C (OCI)との相互運用性について
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ファイルおよび特定のデータベース接続を指定することにより起動されます。
追加のサポートについて
OCCIデモのビルド
『Oracle Database Examplesインストレーション・ガイド』の説明に従って、デモ・プログラムをイインストールする必要があります。これらのデモの一部を本書で例として使用します。例をビルドするには、次の手順を参照してください。
Oracle Technology NetworkでのOCCIについて
フォーラム、ダウンロード、ホワイト・ペーパーなど、OCCIに関する追加情報は、Oracle Technology Network — Oracle C_++_Call Interfaceを参照してください。