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

前
次

OCIリリース8へのインタフェース

SQLLIBライブラリには、Pro*C/C++プログラムで確立したデータベース接続に対して、OCI環境ハンドルおよびサービス・コンテキスト・ハンドルを取得するためのルーチンが用意されています。OCIハンドルを取得すると、ユーザーは様々なOCIルーチンをコールできます。たとえば、クライアント側でDATE算術を実行したり、オブジェクト側でナビゲーション操作を実行したりできます。これらのSQLLIB関数については後述します。これらの関数のプロトタイプは、パブリック・ヘッダー・ファイルsql2oci.hに用意されています。

埋込みSQLと他のOracleプログラム・インタフェースのコールを混在させるPro*C/C++ユーザーは、十分に注意する必要があります。たとえば、ユーザーがOCIインタフェースを使用して直接接続を終了すると、SQLLIBが非同期状態となります。このような場合、Pro*C/C++プログラム内の後続のSQL文の動作は未定義になります。

注意:

Pro*C/C++、Oracle Call Interface(OCI)リリース8およびXAには互換性がありません

Oracle OCIとの相互運用性を提供する次の新しいSQLLIB関数がヘッダー・ファイルsql2oci.h内で宣言されています。

SQLEnvGet()

SQLLIBライブラリ関数SQLEnvGet()(SQLLIBによるOCI環境の取得)を指定すると、所定のSQLLIBランタイム・コンテキストに関連付けられているOCI環境ハンドルへのポインタが戻されます。この関数のプロトタイプは、次のとおりです。

sword SQLEnvGet(dvoid *rctx, OCIEnv **oeh);

説明:

項目 説明

説明

oehをランタイム・コンテキストに対応するOCIEnvに設定します。

パラメータ

rctx (IN) = SQLLIBランタイム・コンテキストへのポインタ。

oeh (OUT) = OCIEnvへのポインタ。

戻り値

成功した場合はSQL_SUCCESS。

失敗した場合はSQL_ERROR。

注意

Pro*C/C++での通常のエラー状況変数(SQLCA、SQLSTATEなど)は、この関数をコールしても影響を受けません。

SQLSvcCtxGet()

SQLLIBライブラリ関数SQLSvcCtxGet()(SQLLIBによるOCIサービス・コンテキストの取得)を指定すると、Pro*C/C++データベース接続用のOCIサービス・コンテキストが戻されます。OCIサービス・コンテキストを使用して、OCI関数を直接コールできます。この関数のプロトタイプは、次のとおりです。

sword SQLSvcCtxGet(dvoid *rctx, text *dbname,
       sb4 dbnamelen, OCISvcCtx **svc);

説明:

項目 説明

説明

svc をランタイム・コンテキストに対応するOCIサービス・コンテキストに設定します。

パラメータ

rctx (IN) = SQLLIBランタイム・コンテキストへのポインタ。

dbname (IN) = この接続の論理名を含むバッファ。

dbnamelen (IN) = dbnameバッファの長さ。

svc (OUT) = OCISvcCtxポインタのアドレス。

戻り値

成功した場合はSQL_SUCCESS。

失敗した場合はSQL_ERROR。

注意

1. Pro*C/C++での通常のエラー状況変数(SQLCA、SQLSTATEなど)は、この関数をコールしても影響を受けません。

2. dbnameは、埋込みSQL文のAT句に使用されている識別子と同じです。

3. dbnameがNULLポインタであるか、dbnamelenが0の場合は、SQL文にAT句が指定されていない場合と同様に、デフォルトのデータベース接続とみなされます。

4. dbnamelenの値が-1の場合は、dbnameが0で終了する文字列であることを示します。

OCIリリース8コールの埋込み

OCIリリース8コールをPro*C/C++プログラムに埋め込む手順は、次のとおりです。

1. パブリック・ヘッダーsql2oci.hを組み込みます。

2. Pro*C/C++プログラム内で環境ハンドル(OCIEnv *型)を次のように宣言します。

OCIEnv *oeh;

3. コールするOCI関数がサービス・コンテキスト・ハンドルを必要とする場合は、オプションとして、Pro*C/C++プログラム内でサービス・コンテキスト・ハンドル(OCISvcCtx *型)を宣言します。

OCISvcCtx *svc;

4. Pro*C/C++プログラム内でエラー・ハンドル(OCIError *型)を宣言します。

OCIError *err;

5. 埋込みSQL文CONNECTを使用してOracleに接続します。接続にはOCIを使用しないでください。

EXEC SQL CONNECT ...

6. SQLEnvGet関数を使用して、必要なランタイム・コンテキストに対応付けられているOCI環境ハンドルを取得します。

シングル・スレッド・アプリケーションの場合は、次のようにします。

retcode = SQLEnvGet(SQL_SINGLE_RCTX, &oeh);

共有サーバー・アプリケーションの場合は、次のようにします。

sql_context ctx1;
...
EXEC SQL CONTEXT ALLOCATE :ctx1;
EXEC SQL CONTEXT USE :ctx1;
...
EXEC SQL CONNECT :uid IDENTIFIED BY :pwd;
...
retcode = SQLEnvGet(ctx1, &oeh);

7. 取得した環境ハンドルを使用してOCIエラー・ハンドルを割り当てます。

retcode = OCIHandleAlloc((dvoid *)oeh, (dvoid **)&err, 
                    (ub4)OCI_HTYPE_ERROR, (ub4)0, (dvoid **)0);

8. 使用するOCIコールに必要な場合は、オプションとして、SQLSvcCtxGetコールを使用してOCIServiceContextハンドルを取得します。

シングル・スレッド・アプリケーションの場合は、次のようにします。

retcode = SQLSvcCtxGet(SQL_SINGLE_RCTX, (text *)dbname, (ub4)dbnlen, &svc);

共有サーバー環境アプリケーションの場合は、次のようにします。

sql_context ctx1;
...
EXEC SQL ALLOCATE :ctx1;
EXEC SQL CONTEXT USE :ctx1;
...
EXEC SQL CONNECT :uid IDENTIFIED BY :pwd AT :dbname
     USING :hst;
...
retcode = SQLSvcCtxGet(ctx1, (text *)dbname, (ub4)strlen(dbname), &svc);

注意:

Pro*C/C++接続名がAT句で指定されていない場合は、NULLポインタがdbnameとして渡されることがあります。