この章では、Oracle C++ Call Interface(OCCI)の概要を説明し、OCCIの説明で使用される特別な用語を示します。Oracle環境で実行するC++アプリケーションの開発に必要な基本情報が提供されます。
ここでは、次の項目について説明します。
Oracle C++ Call Interface(OCCI)は、Application Program Interface(API)の1つです。OCCIを使用すると、C++言語で作成したアプリケーションからOracleデータベース内のデータにアクセスできます。OCCIによって、C++のプログラマは、SQL文の処理やオブジェクト操作などのOracleデータベース操作をすべて実行できます。
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では利用できない制御構造に依存しています。手続き型という性質上、このような言語は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データベース・サーバー内のオブジェクトに対するアクセスおよび操作のための機能も提供します。
OCCIアプリケーションの主なタスクの1つは、SQL文を処理することです。SQL文の種類が異なると、プログラムでは異なる処理ステップが必要になります。OCCIアプリケーションをコーディングする際には、このことを考慮に入れることが重要です。Oracleでは、次の種類のSQL文を認識します。
データ定義言語(DDL)文
制御文
トランザクション制御文
接続制御文
システム制御文
データ操作言語(DML)文
問合せ
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では、オブジェクト表の作成方法を示しています。
DML文は、データベース表にあるデータを変更できます。たとえば、DML文を使用して次の処理を実行します。
表に新しい行を挿入します。
既存の行の列値を更新します。
表から行を削除します。
データベース内の表をロックします。
SQL文の実行計画を説明します。
DML文では、入力バインド変数を使用して、データベースにデータを渡すようにアプリケーションに対して指示できます。例1-4に例を示します。異なるバインド値を使用して、この文を複数回実行することも、配列を挿入して、サーバーとの1回のラウンドトリップで複数の行を追加することもできます。
また、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プロシージャまたはファンクションは、出力変数を戻すこともできます。この出力変数はOUTバインド変数と呼ばれます。例1-8のとおりです。
この例の最初のパラメータは、従業員の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文は、次の部分で構成されています。
SQLコマンド: SELECT
3つの選択リスト項目: first_name
、last_name
およびemail
FROM
句の表名: employees
WHERE
句の2つの列名: department_id
およびcommission_pct
WHERE
句の数値入力値: 80
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では、各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ファイルおよび特定のデータベース接続を指定することにより起動されます。