ランタイム・コンテキストは、通常は単にコンテキストと呼ばれ、クライアント・メモリーの領域へのハンドルです。このクライアント・メモリーには、0個以上の接続、0個以上のカーソル、そのインライン・オプション(MODE、HOLD_CURSOR、RELEASE_CURSOR、SELECT_ERRORなど)および他の状態情報が含まれます。
コンテキスト・ホスト変数を定義するには、sql_context疑似型を使用します。次に例を示します。
sql_context my_context ;
CONTEXT ALLOCATEプリコンパイラ・ディレクティブを使用し、コンテキスト用のメモリーを割り当てて初期化します。
EXEC SQL CONTEXT ALLOCATE :context ;
contextは、コンテキストへのハンドルであるホスト変数です。次に例を示します。
EXEC SQL CONTEXT ALLOCATE :my_context ;
CONTEXT USEプリコンパイラ・ディレクティブを使用して、プログラム・ロジックの流れではなく、ソース・ファイルのその点から埋込みSQL文(CONNECT、INSERT、DECLARE CURSORなど)で使用するコンテキストを定義します。このコンテキストは、別のCONTEXT USE文の検出時まで使用されます。構文は次のとおりです。
EXEC SQL CONTEXT USE {:context | DEFAULT} ;
DEFAULTキーワードでは、以降に実行されるすべての埋込みSQL文で使用されるデフォルト(またはグローバル)・コンテキストが指定されます。このコンテキストは、別のCONTEXT USEディレクティブが検出されるまで使用されます。単純な例を次に示します。
EXEC SQL CONTEXT USE :my_context ;
コンテキスト変数my_contextが定義および割り当てられていない場合、エラーが戻されます。
CONTEXT FREE文を使用すると、コンテキストに使用されたメモリーが不要になった場合に、メモリーを解放できます。
EXEC SQL CONTEXT FREE :context ;
次に例を示します。
EXEC SQL CONTEXT FREE :my_context ;
次の例は、ユーザー定義コンテキストと同じアプリケーションにおけるデフォルト・コンテキストの使用方法を示しています。
CONTEXT USEの例
#include <sqlca.h>
#include <ociextp.h>
main()
{
sql_context ctx1;
char *usr1 = "scott/tiger";
char *usr2 = "system/manager";
/* Establish connection to SCOTT in global runtime context */
EXEC SQL CONNECT :usr1;
/* Establish connection to SYSTEM in runtime context ctx1 */
EXEC SQL CONTEXT ALLOCATE :ctx1;
EXEC SQL CONTEXT USE :ctx1;
EXEC SQL CONNECT :usr2;
/* Insert into the emp table from schema SCOTT */
EXEC SQL CONTEXT USE DEFAULT;
EXEC SQL INSERT INTO emp (empno, ename) VALUES (1234, 'WALKER');
...
}