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ランタイム・コンテキストに関連付けられたOCI環境ハンドルへのポインタを戻します。単一サーバー環境と共有サーバー環境の両方で使用できます。
SQLSvcCtxGet()
。Pro*C/C++データベース接続用のOCIサービス・コンテキスト・ハンドルを戻します。単一サーバー環境と共有サーバー環境の両方で使用できます。
シングル・スレッド・ランタイム・コンテキストを使用するときに、どちらかの関数の最初のパラメータとしてsql2oci.hをインクルードする場合は、(dvoid *)0
として定義されている定数SQL_SINGLE_RCTX
を渡します。
関連項目:
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など)は、この関数をコールしても影響を受けません。 |
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コールを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として渡されることがあります。