1 OCI: 概要
1.1 OCIの概要
Oracle Call Interface (OCI)はApplication Program Interface (API)の1つで、これを使用すると、関数コールを使用してOracle Databaseにアクセスし、SQL文の実行のすべてのフェーズおよびデータ・アクセスを制御するアプリケーションを作成できます。
OCIでは、CとC++言語のデータ型、コール規則、構文およびセマンティックをサポートします。
OCIは次の機能を備えています。
-
システム・メモリーおよびネットワーク接続の効率的な使用による高度なパフォーマンスおよびスケーラビリティ
-
2層クライアント/サーバーまたは複数層環境での動的セッションおよびトランザクション管理に適した一貫性のあるインタフェース
-
N層認証
-
Oracle Databaseオブジェクトを使用したアプリケーション開発の包括的サポート
-
Oracle TimesTen In-Memory DatabaseやOracle In-Memory Database Cacheなどの外部データベースへのアクセス。『Oracle TimesTen In-Memory Database C開発者ガイド』を参照してください。
-
ハードウェアへの追加投資をすることなく、ユーザー数および要求数の増加をサポートするアプリケーション
-
Cプログラミング言語と、実行時にアプリケーションにリンクできる動的ランタイム・ライブラリ(OCIライブラリ)の形式で用意された標準的なデータベース・アクセスおよび検索機能のライブラリを使用して、Oracle Database内のデータおよびスキーマを操作する方法。
-
カプセル化された、または不透明なインタフェース(実装の詳細は見えない)
-
ユーザー認証およびパスワード管理の簡易化
-
アプリケーションのパフォーマンスおよび拡張性を向上させる拡張機能
-
トランザクション管理に適した一貫性のあるインタフェース
-
クライアント側からのOracleオブジェクトに対するアクセスをサポートするOCI拡張機能
-
Oracle Databaseへの他のアクセス方法よりも優れた大きな利点:
-
アプリケーション設計のあらゆる側面におけるきめ細かい制御
-
プログラム実行に対する高度な制御
-
使い慣れた第三世代言語プログラミング手法およびブラウザやデバッガなどのアプリケーション開発ツールの使用
-
スケーラブルなアプリケーション作成を可能にする接続プーリング、セッション・プーリングおよび文キャッシュ
-
動的SQLのサポート
-
様々なオペレーティング・システムに対応したOracleプログラム・インタフェースの可用性
-
コールバックを使用した動的バインドおよび定義
-
サーバー・メタデータのレイヤーを公開する記述機能
-
登録されたクライアント・アプリケーションへの非同期イベント通知
-
配列の挿入、更新、削除を行うための高度な配列データ操作言語(DML)機能
-
コミット要求の実行への関連付けによるラウンドトリップ回数の削減
-
透過的プリフェッチ・バッファを使用した問合せの最適化によるラウンドトリップ回数の削減
-
OCIハンドルに対する相互排他ロック(mutex)を不要にするスレッド・セーフティ
-
多数のユーザーを安全にサポートできるスケーラブルなマルチスレッド・アプリケーションを設計するためのAPI
-
データベース・アクセスの管理、SQL文の処理およびOracle Databaseから取り出したオブジェクトの操作を行うためのSQLアクセス関数
-
Oracle型のデータ属性を操作するためのデータ型マッピングおよび操作関数
-
SQL文を使用せずにデータベースにデータを直接ロードするためのデータ・ロード関数
-
PL/SQLからCのコールバックを書き込むための外部プロシージャ関数
-
1.2 OCIアプリケーションの構築
OCIプログラムは非データベース・アプリケーションと同様の方法でコンパイルおよびリンクできます。処理前のステップやプリコンパイル・ステップを別途行う必要はありません。
OCIでは、最も一般的なコンパイラをサポートしています。OCIプログラムのリンクの詳細は、システムによって異なります。一部のオペレーティング・システムでは、OCIプログラムを正常にリンクさせるために、OCIライブラリに加えて他のライブラリの組込みが必要になる場合があります。オペレーティング・システムでのOCIアプリケーションのコンパイルとリンクの詳細は、使用システムに関するOracle Databaseマニュアルとインストレーション・ガイドを参照してください。
1.3 OCIの代替方法
Oracle Call Interface (OCI)の使用にかわる方法は、次のとおりです。
-
Oracle Database Programming Interface for C (ODPI-C)
-
Oracle C++ Call Interface(OCCI)
-
Oracle Pro*C/C++プリコンパイラ
-
Oracle ODBCドライバ
Oracle Database Programming Interface for C (ODPI-C)
ODPI-Cは、Oracle Databaseドライバおよびユーザー・アプリケーション用の一般的なOracle Call Interface (OCI)機能の使用を容易にするCコードのオープン・ソース・ライブラリです。ODPI-Cは、OCIの上層に位置し、Oracleクライアント・ライブラリを必要とします。ODPI-Cの特徴は次のとおりです。
-
ニッチで特殊なケースのOCI機能を必要としないドライバ・ライターを対象とする簡易な用途に向いています。
-
コードが大幅に少なくなり、ドライバを早く実装できます。Oracle機能がユーザーに対して迅速かつ一貫した方法で公開されます。
-
変数のバインドとフェッチのためのメモリー管理が簡略化されます。
-
バインドと定義(フェッチ用)が自動的にネイティブなC型に変換されるため、追加のコールを作成する必要がありません。これは、特に数値と日付に便利です。LONGおよびLOB列を文字列やバッファとして取得できる機能も利点となります。
-
リソース・ハンドルを検証する、より安全なAPIが提供されます。キャストは必要ありません。参照のカウント・メカニズムにより、アプリケーションによる使用中のOCIリソースの破壊を抑えることにより、復元力が高まります。
-
接続およびリソース管理を簡略化するAPIが提供されます。たとえば、高可用性を確保するためにセッション・プールのpingが自動的に実行されます。
-
属性処理のために複数のgetterおよびsetterモデルを使用するOCIから、代替プログラミング方法が提供されます。
-
共有ライブラリとしてODPI-CをビルドするサンプルのMakefileが提供されます。または、ODPI-Cのソース・コードをプロジェクトに含め、OCIアプリケーションを構築するようにビルドできます。
関連項目:
ODPI-Cでサポートされる機能のリスト、およびそのホーム・ページ、githubでのコードの場所、ドキュメントなどの参照情報のリストについては、ODPI-Cホームページを参照してください。
Oracle C++ Call Interface(OCCI)
Oracle C++ Call Interface (OCCI)は、C++で記述されたアプリケーションが1台以上のOracle Databaseサーバーと対話するためのアプリケーション・プログラミング・インタフェース(API)です。OCCIによって、SQL文の処理やオブジェクトの操作を含めて、Oracle Databaseサーバーで可能なデータベース操作全体をプログラムから利用できるようになります。
Oracle Pro*C/C++プリコンパイラ
Oracle Pro*C/C++プリコンパイラとは、高水準ソース・プログラムで埋込みSQL文を使用可能にするプログラミング・ツールです。プリコンパイラは、ソース・プログラムを入力として受け入れ、埋込みSQL文を標準Oracleランタイム・ライブラリ・コールに変換して、通常の方法でコンパイル、リンクおよび実行できる変更済ソース・プログラムを生成します。
関連項目:
Oracle ODBCドライバ
Oracle ODBC Driverを使用すると、Microsoft WindowsおよびLinux、Solaris、IBM Advanced Interactive eXecutive (AIX)、HP-UX Itaniutm、IBM Linux on Platform zなどのUNIXプラットフォーム上のODBCアプリケーションで、Oracle Net Servicesソフトウェアを使用し、ODBCインタフェースを介して、Oracle Databaseに対する読取りおよび書込みアクセスができます。
関連項目:
Oracle ODBCドライバの詳細は、『Oracle Database開発ガイド』を参照してください。
1.4 SQL文
OCIアプリケーションの主なタスクの1つは、SQL文を処理することです。
SQL文の種類が異なると、プログラムでは異なる処理ステップが必要になります。OCIアプリケーションをコーディングする際には、そのことを考慮に入れることが重要です。Oracle Databaseでは、次の種類のSQL文を認識します。
関連項目:
1.4.1 データ定義言語
データ定義言語(DDL)文は、データベース内のスキーマ・オブジェクトを管理します。
DDL文は、新規の表を作成し、古い表を削除し、その他のスキーマ・オブジェクトを設定します。また、スキーマ・オブジェクトに対するアクセスを制御します。
表を作成し、その表へのアクセスを指定する例を次に示します。
CREATE TABLE employees (name VARCHAR2(20), ssn VARCHAR2(12), empno NUMBER(6), mgr NUMBER(6), salary NUMBER(6)); GRANT UPDATE, INSERT, DELETE ON employees TO donna; REVOKE UPDATE ON employees FROM jamie;
DDL文によって、オブジェクト表を作成する次の一連の文のように、Oracle Database内のオブジェクトを操作することもできます。
CREATE TYPE person_t AS OBJECT ( name VARCHAR2(30), ssn VARCHAR2(12), address VARCHAR2(50)); CREATE TABLE person_tab OF person_t;
1.4.2 制御文
OCIアプリケーションでは、トランザクション制御文、セッション制御文およびシステム制御文を、それらがDML文であるかのように処理します。
関連項目:
これらの種類の文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
1.4.3 データ操作言語
データ操作言語(DML)文は、データベース表にあるデータを変更できます。
たとえば、DML文を使用して次の処理を実行します。
-
表に新しい行を挿入します。
-
既存の行の列値を更新します。
-
表から行を削除します。
-
データベース内の表をロックします。
-
SQL文の実行計画を説明します。
-
入力(バインド)変数を使用して、データベースにデータを渡すようにアプリケーションに対して指示します。
関連項目:
入力バインド変数の詳細は、「OCIのプレースホルダのバインドについて」を参照してください
また、DML文ではOracle Database内のオブジェクトを操作でき、次の例では、person_t
型のインスタンスがオブジェクト表person_tab
に挿入されています。
INSERT INTO person_tab VALUES (person_t('Steve May','987-65-4320','146 Winfield Street'));
1.4.4 問合せ
問合せは、データベースからデータを取り出すための文です。
1つの問合せで、0、1行および複数行のデータを戻すことができます。すべての問合せは、次の例のように、SQLキーワードSELECT
で始まります。
SELECT dname FROM dept WHERE deptno = 42;
問合せは、表の中のデータにアクセスするため、多くの場合DML文として分類されます。ただし、OCIアプリケーションでは問合せの処理方法が異なるため、このマニュアルでは問合せを別個のものとして扱います。
問合せ文では入力(バインド)変数を使用して、データベースにデータを渡すようにプログラムに指示できます。たとえば次のとおりです。
SELECT name FROM employees WHERE empno = :empnumber;
前述のSQL文の:empnumber
は、アプリケーションが指定する値に対するプレースホルダです。
問合せを処理する際、OCIアプリケーションでは、戻される結果を受け取るための出力変数も定義する必要があります。前述の文では、問合せから戻されるname
の値を受け取るために出力変数を定義する必要があります。
関連項目:
-
入力バインド変数の詳細は、「OCIでのバインドの概要」を参照してください
-
出力変数の定義の詳細は、「OCIでの定義の概要」を参照してください
-
OCIプログラムでのSQL文の処理方法の詳細は、「OCIでのSQL文の使用」を参照してください
1.4.5 PL/SQL
PL/SQLは、Oracleが開発したSQL言語の手続き型拡張機能です。
PL/SQLは、単純な問合せやSQLデータ操作言語文よりも複雑なタスクを処理します。PL/SQLを使用すると、いくつかの構文を単一のブロックにグループ化し、1つの単位として実行できます。これらには次のものが含まれます。
-
1つまたは複数のSQL文
-
変数宣言
-
代入文
-
プロシージャ型制御文(IF...THEN...ELSE文とループ)
-
例外処理
OCIプログラムでPL/SQLブロックを使用すると、次の処理を実行できます。
-
Oracle Databaseストアド・プロシージャおよびストアド・ファンクションのコール
-
手続き型制御文を複数のSQL文と結合し、1つの単位として実行
-
レコード、表、カーソルFORループ、例外処理などの特殊なPL/SQL機能へのアクセス
-
カーソル変数の使用
-
暗黙的な結果セットを戻す既存のストアド・プロシージャ設計の再利用を可能にする暗黙的な結果セット機能の利用
-
Oracle Database内のオブジェクトへのアクセスおよび操作
次のPL/SQL例では、特定の従業員番号をキーにして、従業員表から値を取り出すSQL文が発行されます。この例は、PL/SQL文でのプレースホルダの使用方法も示しています。
BEGIN SELECT ename, sal, comm INTO :emp_name, :salary, :commission FROM emp WHERE empno = :emp_number; END;
この文のプレースホルダは、PL/SQL変数ではないことに注意してください。これらは、文の処理時に、データベースに渡される入力値を示しています。これらのプレースホルダは、プログラム内でC言語変数にバインドする必要があります。
関連項目:
-
PL/SQLブロックのコーディングの詳細は、『Oracle Database PL/SQL言語リファレンス』 を参照してください
-
PL/SQLでのプレースホルダの使用方法の詳細は、「PL/SQLのプレースホルダのバインドについて」を参照してください
1.4.6 埋込みSQL
OCIは、アプリケーションが実行時にデータベースに渡すテキスト文字列としてSQL文を処理します。
Oracleプリコンパイラ(Pro*C/C++、Pro*COBOL、Pro*FORTRAN)を使用することによって、SQL文をアプリケーション・コードに直接埋め込むことができます。その後、実行可能なアプリケーションを生成するために別個のプリコンパイル・ステップが必要です。
OCIコールと埋込みSQLはプリコンパイラ・プログラムでは混在できます。
関連項目:
1.4.7 SQL用のOCIの特殊用語
このマニュアルでは、SQL文の様々な部分を参照するために特殊な用語を使用しています。
たとえば、次のSQL文があるとします。
SELECT customer, address FROM customers WHERE bus_type = 'SOFTWARE' AND sales_volume = :sales;
ここには次の要素があります。
-
SQLコマンド -
SELECT
-
2つの選択リスト項目 -
customer
およびaddress
-
FROM
句内の表名 -customers
-
WHERE
句内の2つの列名 -bus_type
およびsales_volume
-
WHERE
句内のリテラル入力値 - 'SOFTWARE
' -
WHERE
句内の入力変数のプレースホルダ -:sales
OCIアプリケーションを開発する際は、プログラムの入出力変数のアドレス(位置)をOracle Databaseに指定しているルーチンをコールします。このマニュアルでは、データ入力用のプレースホルダ変数のアドレスを指定することをバインド操作と呼びます。また、選択リスト項目を受け取るための変数のアドレスを指定することを定義操作と呼びます。
PL/SQLでは、入力の指定も出力の指定もバインド操作と呼びます。
関連項目:
- これらの用語や操作詳細は、「OCIでのSQL文の使用」を参照してください
1.5 手続き型および非手続き型要素
OCIを使用すると、SQLの非手続き型データ・アクセス機能と、CやC++言語の手続き型機能をあわせ持つ複数層アーキテクチャ上で、スケーラブルなマルチスレッド・アプリケーションを開発できます。
-
非手続き型言語のプログラムでは、操作対象となる一連のデータが指定されますが、実行する操作の種類や操作の方法は指定されません。SQLは非手続き型であるため、データベース・トランザクションの実行用として簡単に覚えやすく使用しやすい言語です。また、最新のリレーショナル・データベース・システムおよびオブジェクト・リレーショナル・データベース・システムにおけるデータのアクセスおよび操作に使用される標準言語でもあります。
-
手続き型言語のプログラムでは、大部分の文の実行は、前または後続の文、およびループや条件ブランチなどSQLでは利用できない制御構造に依存しています。手続き型という性質上、このような言語はSQLよりも複雑ですが、柔軟性に富み、非常に強力です。
OCIプログラムでは、非手続き型言語と手続き型言語の要素が組み合されているため、構造化プログラミング環境でOracle Databaseに容易に接続できます。
OCIでは、Oracle Databaseを通じて使用可能なSQLのデータ定義、データ操作、問合せおよびトランザクション制御の機能をすべてサポートしています。たとえば、OCIプログラムでは、Oracle Databaseに対する問合せを実行できます。問合せ文では、次の例のように、入力(バインド)変数を使用して、データベースにデータを渡すようにプログラムに対して指示できます。
SELECT name FROM employees WHERE empno = :empnumber;
前述のSQL文の:empnumber
は、アプリケーションが指定する値に対するプレースホルダです。
また、Oracleが開発したSQLの手続き型拡張要素であるPL/SQLも利用できます。PL/SQLにより、SQLのみで作成されたアプリケーションよりも、さらに強力で柔軟性のあるアプリケーションを開発できます。OCIは、データベース内のオブジェクトに対するアクセスおよび操作のための機能も提供します。
1.6 オブジェクトのサポート
OCIには、オブジェクト型 とオブジェクトを処理する機能があります。
オブジェクト型は、ユーザー定義のデータ構造体で、現実社会の実体を抽象的に表します。たとえば、データベースにperson
(個人)というオブジェクトの定義が含まれているとします。このオブジェクトは、個人を識別するための特徴を表した属性—first_name
、last_name
およびage
を持つことができます。
オブジェクト型の定義は、オブジェクト型のインスタンスを表すオブジェクトの作成の基礎となり、オブジェクト型を構造的な定義として使用することで、person
オブジェクトを属性値 'John'、'Bonivento'および'30'で作成できます。オブジェクト型には、メソッド、つまりそのオブジェクト型の動作を表すプログラム関数を含めることもできます。
OCIは、Oracle Databaseのオブジェクト機能を使用するプログラマに、包括的なアプリケーション・プログラミング・インタフェースを提供します。
これらの機能には次のものが含まれます。
-
オブジェクト・データとスキーマ情報を操作するSQL文の実行
-
SQL文の入力変数としてオブジェクト参照およびオブジェクトのインスタンスを渡す機能
-
SQL文の出力を受け取る変数として、オブジェクト参照およびオブジェクトのインスタンスの宣言
-
データベースからオブジェクト参照およびオブジェクトのインスタンスのフェッチ
-
オブジェクトのインスタンスと参照を戻すSQL文のプロパティの記述
-
オブジェクト・パラメータまたは結果を指定したPL/SQLプロシージャまたはファンクションの記述
-
オブジェクトとリレーショナル機能を同期化するための、コミット・コールとロールバック・コールの拡張
OCI オブジェクト機能は、次の主要なカテゴリに分類できます。
-
オブジェクトへのアクセスおよび操作のためのアソシエイティブ・インタフェースおよびナビゲーショナル・インタフェース
-
オブジェクト型に関する情報にアクセスし、Oracle型のデータ属性を制御するための型管理(マッピングおよび操作関数)
-
Oracle Database内部スキーマ情報をクライアント側の言語バインド変数にマッピングするObject Type Translator(OTT)ユーティリティ
関連項目:
-
SQL文によってアクセスされた後、オブジェクトの操作をサポートするために提供されるその他のOCIコールの詳細は、「カプセル化されたインタフェース」を参照してください
1.6.1 クライアント側のオブジェクト・キャッシュ
オブジェクト・キャッシュは、オブジェクトの参照とメモリー管理をサポートするクライアント側のメモリー・バッファです。
オブジェクト・キャッシュは、OCIアプリケーションがサーバーからクライアント側にフェッチしたオブジェクト・インスタンスを格納し、追跡します。オブジェクト・キャッシュは、OCI環境を初期化するときに作成されます。同じサーバーに対して複数のアプリケーションを実行する際には、それぞれに専用のオブジェクト・キャッシュがあります。オブジェクト・キャッシュは、メモリーに現在あるオブジェクトの追跡、オブジェクトへの参照のメンテナンス、自動オブジェクト・スワッピングの管理、オブジェクトのメタ属性または型情報の追跡を行います。また、オブジェクト・キャッシュには、OCIアプリケーションに対する次の機能が備えられています。
-
オブジェクトのフェッチおよび操作に必要なクライアント/サーバー間のラウンドトリップ回数の削減によるアプリケーションのパフォーマンスの改善
-
クライアント側のキャッシュからのオブジェクト・スワッピングのサポートによる拡張性の向上
-
オブジェクト・レベルのロックのサポートによる同時実行性の向上
1.6.2 アソシエイティブ・インタフェースおよびナビゲーショナル・インタフェース
OCIアプリケーションがオブジェクトへのアクセスに使用できる様々なタイプのインタフェースについて説明します。
OCIを使用したアプリケーションでは、次のような様々な種類のインタフェースを介して、Oracle Database内のオブジェクトにアクセスできます。
-
SQLの
SELECT
文、INSERT
文およびUPDATE
文の使用 -
対応するスマート・ポインタまたは
REF
を横断することによりクライアント側のキャッシュ内のオブジェクトにアクセスする、Cスタイルのポインタ追跡スキームの使用
OCIは、SQLのSELECT
、INSERT
およびUPDATE
文を使用したオブジェクトの操作をサポートするための一連の拡張子付き関数を提供します。Oracle Databaseオブジェクトにアクセスする場合、これらのSQL文では、リレーショナル表にアクセスするような一貫した一連のステップが使用されます。また、OCIには、オブジェクトにアクセスするのに必要な次の関数セットも用意されています。
-
オブジェクト型のインスタンスと参照をSQL文の入出力変数としてバインドおよび定義します。
-
オブジェクト型のインスタンスと参照を含むSQL文を実行します。
-
オブジェクト型のインスタンスと参照をフェッチします。
-
Oracleオブジェクト型の選択リスト項目を記述します。
OCIでは、対応するスマート・ポインタまたはREF
を横断することにより、クライアント側のキャッシュ内にフェッチされているオブジェクトに、Cスタイルのポインタ追跡スキームを使用してアクセスする一連の関数も提供しています。このナビゲーショナル・インタフェースでは、関数が次の目的で使用されます。
-
参照可能な永続オブジェクト(つまり、クライアント側のキャッシュ内のオブジェクトIDを持つ永続オブジェクト)のコピーをスマート・ポインタまたは
REF
を確保することによりインスタンス化します。 -
あるオブジェクトから別のオブジェクトを指し示す
REF
を横断することにより、お互いに接続されているオブジェクトの順序を横断します。 -
オブジェクト属性の値を動的に取得し、設定します。
1.6.3 オブジェクト用のOCIランタイム環境
OCIでは、Oracle Databaseオブジェクトのクライアント側での使用方法を管理するオブジェクト用の関数を提供します。
これらの関数は、次の目的で使用されます。
-
セッションの初期化、データベース・サーバーへのログイン、接続の登録などのオブジェクト機能にアクセスするための、Oracle Databaseサーバーへの接続
-
クライアント側のオブジェクト・キャッシュの設定およびそのパラメータのチューニング
-
エラーおよび警告メッセージの取得
-
データベース内のオブジェクトにアクセスするトランザクションの制御
-
SQLによるオブジェクトへの結合アクセス
-
パラメータまたは結果がOracle型であるPL/SQLプロシージャまたはファンクションの記述
1.6.4 型管理: マッピングおよび操作関数
OCIでは、Oracle Databaseオブジェクトを操作するための2つの関数セットを提供します。
-
型マッピング関数を使用すると、アプリケーションで、Oracle内部データ型としてサーバーで表されているOracleスキーマの属性を、対応するホスト言語型にマップできます。
-
型操作関数を使用すると、ホスト言語のアプリケーションで、Oracleスキーマの個別の属性を操作できます。属性の値を設定および取得したりサーバーにフラッシュできます。
また、OCIDescribeAny()
関数を使用すると、データベース内に格納されたオブジェクトの情報を取得できます。
1.6.5 Object Type Translator
Object Type Translator (OTT)ユーティリティは、Oracleオブジェクト型に関するスキーマ情報を、ホスト言語変数のクライアント側言語バインディングに翻訳します(構造など)。
OTTは、Oracleスキーマ・オブジェクトに関するメタデータ情報を含むintype
ファイルを入力として使用します。また、outtype
ファイル、ヘッダー・ファイルおよび実装ファイルを生成します。これらは、オブジェクト・スキーマに対して実行されるCアプリケーションに含まれている必要があります。OCIアプリケーションとPro*C/C++プリコンパイラ・アプリケーションの両方に、OTTが生成したコードが含まれている場合があります。次の理由により、OTTは非常に便利です。
-
アプリケーション開発者の生産性が向上します。OTTを使用すると、アプリケーション開発者はスキーマ・オブジェクトに対応するホスト言語変数をコーディングする必要がなくなります。
-
SQLを、選択したデータ定義言語としてメンテナンスします。OTTでは、SQLを使用して作成したOracleスキーマ・オブジェクトをホスト言語変数に自動的にマップできるため、SQLがデータ定義言語として使用しやすくなります。その結果、Oracle Databaseによって、データの一貫したモデルをサポートできます。
-
オブジェクト型のスキーマ展開を容易にします。OTTでは、スキーマが変更されたときにインクルードされたヘッダー・ファイルを再生成できるため、Oracleアプリケーションでスキーマ展開をサポートできます。
通常、OTTは、コマンドラインからintype
ファイル、outtype
ファイルおよび特定のデータベース接続を指定することにより起動されます。Oracle Databaseでは、OTTにより、OCIプログラムとPro*C/C++プリコンパイラ・プログラムのどちらでも使用できるC構造体のみを生成できます。
1.7 Simple Oracle Document Access (SODA)
SODA for Cは、Oracle Call Interface (OCI)の一部であるC APIです。
SODA for Cは、Simple Oracle Document Access(SODA)を実装します。これを使用して、あらゆる種類のドキュメントについて作成、読取り(取得)、更新および削除(CRUD)操作を実行でき、これを使用してJSONドキュメントを問い合せることができます。他のOCIプログラムのコンパイルと同じ方法で、SODA for Cを使用するプログラムをコンパイルします。SODAはNoQL形式のAPIセットであり、これを使用すると、Oracle Databaseのドキュメントのコレクションを作成および格納でき、Structured Query Language (SQL)や、ドキュメントのデータがどのようにデータベースに格納されているかを理解していなくても、そのコレクションの取得や問合せを行うことができます。Oracle Databaseでは、JSONデータの格納および問合せをサポートしています。この機能にアクセスするには、特殊なJSON SQL演算子を含むStructured Query Language (SQL)が必要です。SODA for Cでは、SQL/JSONプログラミングの複雑化が抑えられます。
1.8 カプセル化されたインタフェース
OCIコールで使用されるすべてのデータ構造は、ハンドルと呼ばれる不透明なインタフェースの形にカプセル化されます。
ハンドルとは、OCIライブラリによって割り当てられる記憶領域を指す不透明なポインタで、SQL文またはPL/SQL文のコンテキスト情報、接続情報、エラー情報またはバインド情報を格納します。クライアントでは、特定の種類のハンドルを割り当て、正しく定義されたインタフェースを通じて1つ以上のハンドルを移入し、それらのハンドルを使用してサーバーに要求を送信します。その結果、アプリケーションは、アクセッサ関数を使用してそのハンドルに含まれている特定の情報にアクセスできます。
OCIライブラリでは、ハンドルの階層が管理されます。これらのハンドルを使用してOCIインタフェースをカプセル化することには、アプリケーション開発者にとって次のような利点があります。
-
保持する必要があるサーバー側の状態情報が少なくなり、サーバー側のメモリー使用量を削減できます。
-
グローバル変数を使用する必要がなくなること、エラー・レポートを作成しやすくなること、OCI変数のアクセスおよび使用方法に一貫性を保てることにより、生産性が向上します。
-
アプリケーションに影響を与えずに基礎となる構造を変更できます。
1.9 ユーザー認証およびパスワード管理
OCIでは、アプリケーション開発者がユーザー認証およびパスワード管理を実行できます。
これは、いくつかの方法でサポートされています。
-
単一のOCIアプリケーションで、複数のユーザーを認証およびメンテナンスできます。
-
OCIアプリケーションで、ユーザーのパスワードを更新でき、認証の処理でパスワード期限切れのメッセージが戻された場合に特に役立ちます。
OCIでは、次の2種類のログイン・セッションをサポートします。
-
シングル・ユーザーがログイン名とパスワードを使用してデータベースに接続するセッション用のログイン関数。
-
ログイン・セッション(ユーザーがOracle Databaseにログインするときに作成されるセッション)をユーザー・セッション(ユーザーが作成したその他すべてのセッション)から分離することにより、単一のOCIアプリケーションで複数のセッションの認証とメンテナンスを行うメカニズム。
SYSDBA
やSYSOPER
などの特権接続、プロキシ認証、外部認証などもサポートされます。
1.9.1 Identity and Access Management (IAM)トークンベース認証
この項では、OCIアプリケーションのトークンベースの認証について説明します。OCIは、パスワードと外部の2種類の認証資格証明を受け入れます。外部は、Kerberos、SSLまたはRADIUS資格証明を指します。IAMデータベース・アクセス・トークン(DBトークン)は、外部認証資格証明とみなされます。
ノート:
この機能は現在、Linux x86-64プラットフォームでのみ使用できます。- デプロイメント時のアプリケーション変更なし: トークンをトークン・ファイルに格納します。その場所はOCI関数への入力として提供されます。トークン・ファイルはIAMユーザーに対応するトークンを1つのみ含むと想定されています。
- プログラムによるアプリケーションの変更が必要: 拡張OCI APIを使用して、トークンを属性/値のペアとして動的に提供します。
現在、OCIは、IAMトークンベース認証用のOracle Cloud InfrastructureのProof of Possession (PoP)アクセス・トークンをサポートしています。PoPトークンは、公開キーと秘密キーのペアに関連付けられています。
Oracle Cloud InfrastructureのPoPトークンでは、クライアントの公開キーがJSON Webキー(JWK)フィールドとしてトークンに埋め込まれます。データベース・サーバーは、OCIに対応する秘密キーがあることを確認できます。Oracle Cloud InfrastructureのPoPトークンは、テナンシまたはコンパートメント内のリソースのアイデンティティとスコープの両方に使用されます。データベース・アクセス用にPoP DBトークンが提供される場合、関連付けられた秘密キーも提供する必要があります。トークンのクライアントは、シングル・サインオン(SSO)フロー中にPoPキーを登録することで認証できます。
ノート:
IAM DBトークンは存続期間が短く、デフォルトの有効期限は60分です。期限切れ後に更新する必要があります。1.9.1.1 スタンドアロン・ユーザー・セッション
この項では、スタンドアロン・セッション作成用のDBトークンをサポートするための拡張機能について説明します。
OCISessionBegin()
OCISessionGet()
1.9.1.1.1 プログラムによるDBトークンの提供
通常、OCISessionBegin()
およびOCISessionGet()
関数は、データベース・ユーザー名とパスワードが属性として設定されたユーザー・ハンドルを受け入れます。トークンベースの認証では、ユーザー名とパスワードを設定するのではなく、ユーザー・ハンドルに2つの新しい属性OCI_ATTR_TOKEN
およびOCI_ATTR_IAM_PRIVKEY
を設定する必要があります。これらの属性は、OCISessionBegin()
関数を呼び出す前に設定する必要があります。これらの属性は、それぞれDBトークンと秘密キーを指定します。
IAMベースのトークン認証でセッション・プールのコールバック関数を設定するために使用される他の属性があります。
関連項目:
認証情報ハンドル属性1.9.1.1.2 ファイルでのDBトークンの提供
この項では、DBトークンをファイルに提供する方法について説明します。
- DBトークンは、Oracle Cloud Infrastructure (OCI)コマンドライン・インタフェース(CLI)を使用してIAMからリクエストできる一意の文字列です。
- このDBトークンがトークン・ファイルにコピーされます。
- トークン・ファイルの場所は、新しいパラメータ
TOKEN_LOCATION
を使用して、データベース接続文字列で指定されます。 OCI_CRED_EXT
モードが、OCISessionBegin()
コールに渡されます。OCI_SESSGET_CREDEXT
モードが、OCISessionGet()
コールに渡されます。-
前の呼出しの認証ハンドルまたはユーザー・ハンドルにユーザー名またはパスワードが指定されていません。
1.9.1.2 セッション・プール
この項では、DBトークンをサポートするためのOCISessionPool
の機能拡張について説明します。
アプリケーションは、OCIセッション・プールを使用してセッションをキャッシュします。アプリケーションはプールからセッションを取得し、データベース操作を実行し、セッションをプールに戻すことができます。
ノート:
DBトークンベースの認証は、同種のセッション・プールでのみサポートされます。
1.9.1.2.1 プログラムによるDBトークンの提供
セッション・プール・ハンドルに認証ハンドルを設定して、セッション前の作成属性を指定できます。認証ハンドルは、DBトークンと秘密キーの設定をサポートするように拡張されています。
OCIAuthInfo
およびOCISPool
ハンドルを割り当てます- 認証ハンドルにDBトークンおよび秘密キー属性を設定します
- セッション・プール・ハンドルに認証ハンドルを設定します
OCISessionPoolCreate(..., <null user/passwd arguments> ...,OCI_SPC_HOMOGENEOUS)
をコールします- プールを使用して
OCISessionGet(..., OCI_SESSGET_SPOOL)
およびOCISessionRelease()
コールを発行して、セッションをチェック・アウトおよびチェック・インします - トークンおよび認証ハンドル内のキーは、
OCISessionPoolCreate()
関数のコール後にOCIによってキャッシュされます - プールを拡張する(新しい接続を作成する)必要がある場合、トークンが期限切れになると、最新のトークンとキーを提供するコールバック関数がコールされます
OCIには、IAMベースのトークン認証を使用して、セッション・プールのコールバック関数とコンテキストを設定するためのその他の属性も用意されています。コールバック属性は、OCIを介してプログラムによりセッション・プール内のセッションの期限切れトークンを更新するように設定する必要があります。OCIでのトークンベース認証のコールバック属性、関数およびコンテキストの作成および設定の詳細は、「認証情報ハンドル属性」の項を参照してください。
1.9.1.2.2 ファイルでのDBトークンの提供
- トークン・ファイルの場所は、新しいパラメータ
TOKEN_LOCATION
を使用して、データベース接続文字列で指定されます。 OCISessionPoolCreate(..., <null user/passwd arguments>, .. OCI_DEFAULT)
をコールしますOCI_SESSGET_CREDEXT
モードをOCISessionGet()
コールに渡します- 前の呼出しの認証ハンドルまたはユーザー・ハンドルにユーザー名またはパスワードが指定されていません
- セッション・プールで新しい接続を作成する必要があり、元のトークンが期限切れになった場合、元のトークン・ファイル・コンテンツを新しいトークン値で置換すると、セッションの確立が成功します
関連項目:
1.10 アプリケーションのパフォーマンスおよび拡張性を向上させる機能
OCIには、アプリケーションのパフォーマンスおよび拡張性を改善する、いくつかの拡張機能があります。
クライアントとサーバー間のラウンドトリップ回数を減らすことにより、アプリケーションのパフォーマンスが改善され、さらにサーバー側で保持する必要がある状態情報の量を減らすことにより拡張性も向上しています。これらの機能には、次のものがあります。
-
何度も使用される実行可能文をキャッシュすることによってパフォーマンスを向上させる文キャッシュ
-
データベース・サーバーへのラウンドトリップ回数を制限するクライアント結果キャッシュ
-
記述のラウンドトリップをなくし、ラウンドトリップ回数およびメモリー使用量を削減する、
SELECT
文結果セットの暗黙的なプリフェッチ -
オープン・カーソルとクローズ・カーソルのラウンドトリップの排除
-
マルチスレッド環境のサポート
-
接続上のセッション多重化
-
標準の2層クライアント/サーバー構成、サーバー/サーバー・トランザクション調整、3層トランザクション処理(TP)モニター構成など、様々な構成に対する一貫したサポート
-
XAインタフェースのTM_JOIN操作のサポートを含む、ローカル・トランザクションおよびグローバル・トランザクションに対する一貫したサポート
-
接続中のユーザー接続、処理およびセッションを集結する機能を提供し、グローバル・トランザクションのブランチごとに個別のセッションを作成する必要性をなくしたことによる、拡張性の向上
-
アプリケーションによる複数のユーザーの認証、および複数のユーザーのためのトランザクションの開始
1.11 Oracle Databaseアドバンスト・キューイング
OCIでは、Oracle Databaseアドバンスト・キューイング(Database AQ)機能へのインタフェースを提供します。
Database AQは、Oracle Databaseと統合されたメッセージ・キューイングです。Database AQでは、キューイング・システムをデータベースに統合することによりこの機能を実現しており、その結果メッセージ対応データベースが作成されます。Database AQでは、統合されたソリューションを提供することにより、開発者がメッセージ交換インフラストラクチャを構築する必要をなくし、特定のビジネス・ロジックに専念できるようにします。
1.12 XAライブラリ・サポート
OCIは、Oracle XAライブラリをサポートしています。
xa.h
ヘッダー・ファイルは、他のすべてのOCIヘッダー・ファイルと同じ場所にあります。LinuxまたはUNIXの場合、パスは$ORACLE_HOME/rdbms/public
です。LinuxまたはUNIXでdemo_rdbms.mk
ファイルを使用しているユーザーが影響を受けないのは、$ORACLE_HOME/rdbms/public
ディレクトリがすでにこのMakefileに記載されているためです。
Windowsの場合、パスはORACLE_BASE\ORACLE_HOME
\oci\include
です。
関連項目:
-
WindowsおよびXAアプリケーションの詳細は、「Oracle XAライブラリ」を参照してください
-
Oracle XAによるアプリケーションの開発の詳細は、『Oracle Database開発ガイド』を参照してください