プライマリ・コンテンツに移動
Pro*C/C++プログラマーズ・ガイド
12c リリース1(12.1)
B71397-03
目次へ移動
目次
索引へ移動
索引

前
次

OCIアプリケーションでのOTTの使用方法

OTTによって生成されるC言語のヘッダー・ファイルと実装ファイルは、データベース・サーバーのオブジェクトにアクセスするOCIアプリケーションで使用できます。ヘッダー・ファイルをOCIコードに取込むには、#include文を使用します。

OCIアプリケーションでは、ヘッダー・ファイルを組み込んだ後、ホスト言語形式のオブジェクト・データにアクセスし、操作できます。

図19-1は、OCIでOTTを使用する場合に必要な手順を示しています。

  1. SQLを使用してデータベースに型定義を作成します。
  2. OTTで、オブジェクト型と名前付きコレクション型のC表現を含むヘッダー・ファイルを生成します。INITFILEオプションで命名された実装ファイルも生成します。
  3. アプリケーションを記述します。OCIアプリケーションでユーザーが記述したコードで、INITFUNC関数を宣言してコールします。
  4. ヘッダー・ファイルをOCIソース・コード・ファイルにインクルードします。
  5. OTTで生成された実装ファイルを含めて、OCIアプリケーションがコンパイルされ、OCIライブラリにリンクされます。
  6. OCI実行可能ファイルをOracleサーバーに対して実行します。

図19-1 OCIでのOTTの使用方法

OCIでのOTTの使用方法
「図19-1 OCIでのOTTの使用方法」の説明

OCIでのオブジェクトへのアクセスおよび操作について

アプリケーション内部では、OCIプログラムでバインド操作と定義操作を実行できます。そのためには、OTTで生成したヘッダー・ファイルに示されている型で宣言したプログラム変数を使用します。

たとえば、アプリケーションでSQLのSELECT文を使用してオブジェクトへのREFをフェッチし、適切なOCI関数を使用してそのオブジェクトを確保します。オブジェクトを確保した後、その他のOCI関数を使用してそのオブジェクトの属性データにアクセスし、操作できます。

OCIには、データ型のマッピングと操作のための一連の関数が組み込まれています。これらの関数は、オブジェクト型と名前付きコレクション型の属性を操作するために明確に設計されています。

次に、使用可能な関数の一部を示します。

  • OCIStringSize()は、OCIString文字列のサイズを取得します。

  • OCINumberAdd()は、2つのOCINumber数値を加算します。

  • OCILobIsEqual()は、2つのLOBロケータが等しいかどうかを比較します。

  • OCIRawPtr()は、OCIRawのRAWデータ型へのポインタを取得します。

  • OCICollAppend()は、コレクション型(OCIArrayまたはOCITable)に要素を追加します。

  • OCITableFirst()は、NESTED TABLE(OCITable)の最初の既存要素の索引を戻します。

  • OCIRefIsNull()は、REF(OCIRef)がNULLかどうかをテストします。

これらの関数については、『Oracle Call Interfaceプログラマーズ・ガイド』の次の各章で詳しく説明しています。

  • 第2章(バインドと定義付けなどのOCI概念の説明)

  • 第6章(オブジェクトへのアクセスとナビゲーションの説明)

  • 第7章(データ型のマップと操作の説明)

  • 第12章(データ型のマップと操作の関数のリスト)

初期化関数のコールについて

OTTは、必要に応じてC初期化関数を生成します。初期化関数では、プログラムで使用されている各オブジェクト型について、どのバージョンの型が使用されているかを環境に通知します。INITFUNCオプションでOTTを起動する場合は、初期化関数の名前を指定するか、初期化関数が含まれている実装ファイル(INITFILE)の名前に基づいてデフォルト名を選択できます。

初期化関数には、環境ハンドル・ポインタとエラー・ハンドル・ポインタの2つの引数があります。一般的に、使用する初期化関数は1つですが、必ずしもそうである必要はありません。プログラムにコンパイル済の個別のピースがあり、異なる型を要求する場合は、各ピースに対して初期化関数が含まれた1つの初期化ファイルをそれぞれ要求して、OTTを個別に実行できます。

OCIEnvInit()をコールするなど、明示的なOCIオブジェクト・コールによって環境ハンドルを作成した後に、環境ハンドルごとに初期化関数も明示的にコールする必要があります。これによって、各ハンドルからプログラム全体で使用されるすべてのデータ型にアクセスできます。

EXEC SQL CONTEXT USEやEXEC SQL CONNECTなどの埋込みSQL文を使用して環境ハンドルを暗黙的に作成する場合、ハンドルは暗黙的に初期化され、初期化関数をコールする必要はありません。これは、Pro*C/C++アプリケーションまたはPro*C/C++とOCIアプリケーションが併用される場合に適用されます。

次に、初期化関数の例を示します。

INTYPEファイルex2c.typを指定します。このファイルには次の型が含まれています。

TYPE SCOTT.PERSON
TYPE SCOTT.ADDRESS

また、次のコマンドラインを含みます。

ott userid=scott/tiger intype=ex2c outtype=ex2co hfile=ex2ch.h initfile=ex2cv.c

OTTによって、次のようなファイルex2cv.cが生成されます。

#ifndef OCI_ORACLE
#include <oci.h>
#endif

sword ex2cv(OCIEnv *env, OCIError *err)
{
   sword status = OCITypeVTInit(env, err);
   if (status == OCI_SUCCESS)
      status = OCITypeVTInsert(env, err,
          "SCOTT", 5,
          "PERSON", 6,
          "$8.0", 4);
    if (status == OCI_SUCCESS)
        status = OCITypeVTInsert(env, err,
           "SCOTT", 5,
           "ADDRESS", 7,
           "$8.0", 4);
    return status;
}

関数ex2cvによってタイプ・バージョン表が作成され、SCOTT.PERSON型およびSCOTT.ADDRESS型が挿入されます。

プログラムで明示的に環境ハンドルを作成する場合、明示的に作成するハンドルごとに初期化関数をコールする必要があるので、すべての初期化関数を生成し、コンパイルし、リンクしてください。プログラムが明示的に環境ハンドルを作成しない場合、初期化関数は必要ありません。

OTTで生成したヘッダー・ファイルを使用するプログラムでは、同時に生成された初期化関数も使用する必要があります。具体例として、コンパイルによってプログラムPにリンクされるコードが生成される場合を考えます。OTTによって生成されるヘッダー・ファイルをコンパイル環境にインクルードし、プログラムPのどこかで環境ハンドルが明示的に作成される場合は、それと同時にOTTによって生成される実装ファイルもコンパイルしてプログラムPにリンクする必要があります。この操作は、プログラマが正しく実行する必要があります。

初期化関数の作業

C初期化関数は、OTTで処理する型のバージョン情報を提供します。C初期化関数は、OTTで処理する各オブジェクト・データ型の名前とバージョン識別子を型バージョン表に追加します。

Open Type Manager(OTM)では、特定のプログラムで使用する型のバージョンを識別するためにタイプ・バージョン表を使用します。OTTによって様々な初期化関数が別々に生成されると、タイプ・バージョン表に同じ型がいくつも追加されることがあります。型が何度も追加されると、そのたびにOTMによって同じバージョンの型が登録されているかどうかが確認されます。

初期化関数に対して関数プロトタイプを宣言し、その関数をコールするのは、OCIプログラマの役割です。

注意:

Oracleの現行のリリースでは、それぞれの型のバージョンは1つのみです。タイプ・バージョン表の初期化は、Oracleの将来のリリースとの互換性のためにのみ必要です。