連想アクセス用インタフェースは、オブジェクトの一時コピーを操作します。メモリーは、EXEC SQL ALLOCATE文を使用してオブジェクト・キャッシュ内で割り当てます。
SQLLIBランタイム・コンテキストごとに、オブジェクト・キャッシュが1つずつ作成されます。
各オブジェクトは、EXEC SQL SELECT文またはEXEC SQL FETCH文によって取り出されます。この2つの文では、ホスト変数の属性値が設定されます。NULLインジケータが与えられている場合は、それも設定されます。
オブジェクトの挿入、更新または削除には、EXEC SQL INSERT文、EXEC SQL UPDATE文およびEXEC SQL DELETE文を使用します。文が実行される前に、オブジェクトのホスト変数の属性を設定する必要があります。
トランザクション文EXEC SQL COMMITおよびEXEC SQL ROLLBACKは、変更をサーバーに永続的に書き込むときや、変更を取り消すときに使用します。
EXEC SQL FREE文を使用すると、オブジェクト・キャッシュ内のメモリーを明示的に解放できます。接続の終了時には、その割当て済メモリーが暗黙的に解放されます。
次のような場合に使用します。
表の明示的な結合による処理上の負荷が大きくはないような、オブジェクトの大規模なコレクションにアクセスする場合。
参照できないオブジェクトにアクセスする場合。このようなオブジェクトには、識別性がありません。たとえば、リレーショナル列内のオブジェクト型などです。
一連のオブジェクトにUPDATEやINSERTなどの操作を適用する場合。たとえば、特定部門のすべての従業員に$1000のボーナスを追加する場合などです。
オブジェクト・キャッシュに領域を割り当てるには、次の文を使用します。構文は次のとおりです。
EXEC SQL [AT [:]database] ALLOCATE :host_ptr [[INDICATOR]:ind_ptr] ;
入力する変数は、次のとおりです。
database (IN)
データベース接続の名前を含むヌル文字で終了する文字列。データベース接続は次の文で事前に行われています。
EXEC SQL CONNECT :user [AT [:]database];
AT句のATを省略するか、databaseが空の文字列であれば、デフォルトのデータベース接続とみなされます。
host_ptr (IN)
オブジェクト型、コレクション・オブジェクト・タイプまたはREFに対してOTTにより生成されたホスト構造体へのポインタ、またはC言語のデータ型であるOCIDate、OCINumber、OCIRawまたはOCIStringのいずれかへのポインタ。
ind_ptr (IN)
標識変数ind_ptrとキーワードINDICATORはともにオプションです。構造体の型を持つインジケータへのポインタにかぎり、ALLOCATE文およびFREE文に指定できます。
host_ptrおよびind_ptrには、ホスト配列を構成できます。
割当てはセッションが終了するまで有効です。どのインスタンスも、FREE文で明示的に解放されなくても、セッション(接続)が終了すると解放されます。
詳細は、ALLOCATE(実行可能埋込みSQL拡張機能)およびFREE(実行可能埋込みSQL拡張機能)を参照してください。
EXEC SQL [AT[:]database] [OBJECT] FREE :host_ptr [[INDICATOR]:ind_ptr];
オブジェクト・キャッシュに格納されるオブジェクトの領域の割当てを解除するには、FREE文を使用します。この文に使用する変数は、ALLOCATE文の場合と同じです。
注意:
ホスト変数や標識変数へのポインタは、NULLには設定されません。
EXEC SQL [AT [:]database] [OBJECT] CACHE FREE ALL;
前述の文を使用すると、指定したデータベース接続用のオブジェクト・キャッシュ・メモリーがすべて解放されます。
SQLを使用してオブジェクトにアクセスする場合、Pro*C/C++アプリケーションは永続オブジェクトの一時コピーを操作します。これは、SELECT、UPDATEおよびDELETEの各文を使用するリレーショナル・アクセス・インタフェースの直接の拡張です。
図17-1では、永続オブジェクトの一時コピーにALLOCATE文でキャッシュを割り当てます。割り当てられるオブジェクトにデータは含まれていませんが、OTTによって生成される構造体の形式をとります。
person *per_p; ... EXEC SQL ALLOCATE :per_p;
SELECT文を実行してキャッシュに移入できます。また、FETCH文やC言語の代入を使用してキャッシュにデータを入れることもできます。
EXEC SQL SELECT ... INTO :per_p FROM person_tab WHERE ...
図のように、INSERT、UPDATEまたはDELETE文を使用して、サーバー・オブジェクトを変更します。データは、次のINSERT文を使用して表に挿入できます。
EXEC SQL INSERT INTO person_tab VALUES(:per_p);
最後に、FREE文を使用して、オブジェクトのコピーに対応するメモリーを解放します。
EXEC SQL FREE :per_p;