ナビゲーショナル・アクセス用インタフェースを使用すると、連想アクセス用インタフェースと同じスキーマにアクセスできます。ナビゲーショナル・アクセス用インタフェースはオブジェクトに対するREFを間接参照して、あるオブジェクトから他のオブジェクトへとたどる(ナビゲート)ことで(永続および一時)オブジェクトにアクセスします。次に、一部の定義を示します。
オブジェクトの確保とは、オブジェクトを間接参照し、プログラムがオブジェクトにアクセスできるようにするという意味の用語です。
オブジェクトの確保解除とは、オブジェクトが不要になったことをキャッシュに対して示すことです。
間接参照とは、サーバーがREFを使用してクライアント内にそのオブジェクトのある版を作成することであると定義できます。キャッシュ内では、各オブジェクトとそれに対応するサーバー・オブジェクトとの間の対応付けが保たれますが、自動的な一貫性は得られません。キャッシュ内の各オブジェクトの内容の正確さと一貫性を確認するのは、ユーザーの責任です。
オブジェクト・コピーのリリースとは、キャッシュに対してオブジェクトが現在使用されていないことを示すことです。メモリーを解放するために、不要になったオブジェクトをリリースして暗黙的にメモリーの解放ができるようにします。
オブジェクト・コピーを解放すると、オブジェクト・コピーはキャッシュから削除され、使用されていたメモリーが解放されます。
オブジェクトをマークすることで、キャッシュ内のオブジェクト・コピーが更新されており、オブジェクト・コピーをフラッシュするときに対応するサーバー・オブジェクトを更新する必要があることが、キャッシュに通知されます。
オブジェクトをマーク解除すると、オブジェクトが更新されたという指示が削除されます。
オブジェクトをフラッシュすると、キャッシュ内のマークされたコピーに対して行ったローカルな変更が、サーバー内の対応するオブジェクトに書き込まれます。この時点で、キャッシュ内のオブジェクト・コピーもマーク解除されます。
キャッシュ内のオブジェクト・コピーをリフレッシュすると、そのコピーは、サーバー内の対応するオブジェクトの最新値に置き換わります。
ナビゲーショナル・アクセス用インタフェースと連想アクセス用インタフェースは併用できます。
関連項目:
ナビゲーショナル・アクセス用インタフェースと連想アクセス用インタフェースの併用方法は、ナビゲーショナル・アクセスのサンプル・コードを参照してください。
キャッシュ・コピーを更新、削除およびフラッシュする(キャッシュ内の変更をサーバーに書き込む)には、EXEC SQL OBJECT文、ナビゲーショナル・アクセス用インタフェースを使用します。
次の場合にナビゲーショナル・アクセス用インタフェースを使用します。
表の明示的な結合による処理上の負荷が大きい単一のオブジェクト、もしくは少数のオブジェクトへアクセスする場合。間接参照(DEREF)を使用してオブジェクト間でナビゲートする場合は、表全体の明示的な結合よりも処理負荷の少ない暗黙的な結合を行います。
多数の異なるオブジェクトに多数の少しの変更を加える場合。すべてのオブジェクトをクライアントにフェッチし、変更し、更新済としてマーク設定してから、変更後のすべてのオブジェクトをフラッシュしてサーバーに戻すほうが手軽です。
埋込みSQL OBJECT文は、次の仮定のもとに後述します。
AT句がない場合、デフォルト(名前なし)接続とみなされます。
特に指定する場合を除き、ホスト変数は配列になります。
配列サイズを明示的に指定するには、FOR句を使用します。FOR句がない場合、永続ホスト変数の最小サイズが使用されます。
文の実行後に、SQLCAを状態変数として使用すると、処理された要素数はsqlca.sqlerrd[2]に戻されます。
パラメータには、入力または出力を示すINまたはOUT(あるいはその両方)が指定されています。
関連項目:
SQL OBJECT文と構文図は、埋込みSQL文およびディレクティブを参照してください。
EXEC SQL [AT [:]database] [FOR [:]count] OBJECT CREATE :obj [INDICATOR]: obj_ind [TABLE tab] [RETURNING REF INTO :ref] ;
tabは次のとおりです。
{:hv | [schema.]table}
この文を使用して、オブジェクト・キャッシュ内で参照可能オブジェクトを作成します。オブジェクトの型は、ホスト変数objに対応します。オプションの型ホスト変数(:obj_ind,:ref,:ref_ind
)を指定する場合は、すべてが同じ型に対応している必要があります。
参照可能オブジェクトは、永続オブジェクト(TABLE句あり)でも一時オブジェクト(TABLE句なし)でもかまいません。永続オブジェクトは、暗黙的に保持され、更新済としてマークされます。一時オブジェクトは、暗黙的に保持されます。
ホスト変数は、次のとおりです。
obj (OUT)
オブジェクト・インスタンス・ホスト変数objは、OTTが生成した構造体へのポインタである必要があります。この変数は、オブジェクト・キャッシュ内で作成される参照可能オブジェクトを判別するために使用されます。正常に実行されると、objは新規作成されたオブジェクトを指します。
obj_ind (OUT)
この変数はOTTが生成したインジケータ構造体を指します。その型は、オブジェクト・インスタンスのホスト変数の型と対である必要があります。正常に実行されると、obj_indは参照可能なオブジェクトに対する対になるインジケータ構造体へのポインタとなります。
tab (IN)
TABLE句を使用して永続オブジェクトを作成します。表名は、ホスト変数hv、または未宣言のSQL識別子として指定できます。スキーマ名で修飾することもできます。表名を含むホスト変数には、後続ブランクを使用しないでください。
hv (IN)
表を指定するホスト変数。ホスト変数を使用する場合、配列を使用しないでください。また、空白文字で埋めないでください。大/小文字が区別されます。永続オブジェクトの配列を作成すると、すべてが同じ表に対応付けられます。
table (IN)
大/小文字が区別される未宣言のSQL識別子。
ref (OUT)
参照ホスト変数は、OTTによって生成される参照の型へのポインタである必要があります。refの型は、オブジェクト・インスタンスのホスト変数の型と同じである必要があります。実行後のrefには、新規作成されたオブジェクトのrefへのポインタが含まれます。
属性は、NULLに初期設定されます。オブジェクト・ビューに対する新しいオブジェクトの作成は現在サポートされていません。
オブジェクト・ビューに対する新しいオブジェクトの作成は現在サポートされていません。
EXEC SQL [AT [:]database] [FOR [:]count] OBJECT DEREF :ref INTO :obj [[INDICATOR]:obj_ind ] [FOR UPDATE [NOWAIT]] ;
オブジェクト参照refを指定すると、OBJECT DEREF文は指定されたrefに対応するオブジェクトまたはオブジェクトの配列を、オブジェクト・キャッシュ内で保持します。これらのオブジェクトへのポインタは、変数objおよびobj_ind内で戻されます。
ホスト変数は、次のとおりです。
ref (IN)
これはオブジェクト参照変数であり、OTTによって生成される参照の型へのポインタである必要があります。この変数(または変数の配列)は間接参照され、キャッシュ内のそれに対応するオブジェクトへのポインタを戻します。
obj (OUT)
オブジェクト・インスタンスのホスト変数objはOTTが生成した構造体へのポインタである必要があります。その型は、オブジェクト参照のホスト変数の型と同じである必要があります。正常に実行されると、objにはオブジェクト・キャッシュ内で保持されたオブジェクトへのポインタが含まれます。
obj_ind (OUT)
オブジェクト・インスタンス標識変数obj_indはOTTが生成したインジケータ構造体へのポインタである必要があります。その型は、オブジェクト参照の標識変数の型と対である必要があります。正常に実行されると、obj_indには参照可能オブジェクトと対になるインジケータ構造体へのポインタが含まれます。
FOR UPDATE
この句を指定すると、サーバー内でそれに対応するオブジェクト用に排他ロックが取得されます。
NOWAIT
このオプション設定のキーワードを指定すると、別のユーザーがすでにオブジェクトをロックしていた場合、ただちにエラーが戻されます。
EXEC SQL [AT [:]database] [FOR [:]count] OBJECT RELEASE :obj ;
この文では、オブジェクト・キャッシュ内のオブジェクトが確保解除されます。オブジェクトが確保されず、更新もされなければ、暗黙的な解放の対象になります。
オブジェクトがn回間接参照された場合は、オブジェクト・キャッシュから暗黙的に解放されるように、n回リリースする必要があります。不要になったオブジェクトは、すべてリリースすることをお薦めします。
EXEC SQL [AT [:]database] [FOR [:]count] OBJECT DELETE :obj ;
永続オブジェクトの場合、この文はオブジェクト・キャッシュ内のオブジェクトまたはオブジェクトの配列を削除済としてマークします。オブジェクトがサーバー内で削除されるのは、そのオブジェクトのフラッシュ時またはキャッシュのフラッシュ時です。オブジェクト・キャッシュ内で確保されているメモリーは解放されません。
一時オブジェクトの場合は、そのオブジェクトが削除済としてマーク設定されます。オブジェクト用のメモリーは解放されません。
EXEC SQL [AT [:]database] [FOR [:]count] OBJECT UPDATE :obj ;
永続オブジェクトの場合、この文はオブジェクト・キャッシュ内でオブジェクトを更新済としてマークします。変更結果は、オブジェクトのフラッシュ時またはキャッシュのフラッシュ時に、サーバーに書き込まれます。
一時オブジェクトの場合、この文は何も操作しません。
EXEC SQL [AT [:]database] [FOR [:]count] OBJECT FLUSH :obj ;
この文は、更新済、削除済または作成済としてマークされた永続オブジェクトをサーバーにフラッシュします。
注意:
オブジェクトがフラッシュされると、排他ロックが暗黙的に取得されます。この文が正常終了すると、オブジェクトのマークが削除されます。オブジェクトのバージョンがLATEST(後続の項を参照)であれば、暗黙的にリフレッシュされます。
ナビゲーショナル・アクセス用インタフェースの実例は、図17-2を参照してください。
ALLOCATE文を使用して、personオブジェクトを指すREFのコピー用に、オブジェクト・キャッシュ内のメモリーを割り当てます。割り当てられたREFには、データは含まれません。
person *per_p; person_ref *per_ref_p; ... EXEC SQL ALLOCATE :per_p;
SELECT文を使用してpersonオブジェクトのREFを取り出すことで、割り当てたメモリーに移入します(正確な書式はアプリケーションによって異なります)。
EXEC SQL SELECT ... INTO :per_ref_p;
次に、オブジェクト内で変更できるように、DEREF文を使用してキャッシュ内でオブジェクトを確保します。DEREF文は、ポインタper_ref_pを使用して、クライアント側キャッシュ内でpersonオブジェクトのインスタンスを作成します。personオブジェクトへのポインタper_pが戻されます。
EXEC SQL OBJECT DEREF :per_ref_p INTO :per_p;
C言語の代入文を使用するか、またはOBJECT SET文によるデータ変換を使用して、キャッシュ内でオブジェクトを変更します。
次に、オブジェクトを更新済としてマーク設定する必要があります。図17-3を参照してください。キャッシュ内のオブジェクトを更新済としてマーク設定し、サーバーにフラッシュできるようにするには、次の文を使用します。
EXEC SQL OBJECT UPDATE :per_p;
FLUSH文によって変更結果をサーバーに送ります。
EXEC SQL OBJECT FLUSH :per_p;
オブジェクトをリリースします。
EXEC SQL OBJECT RELEASE :per_p;
オブジェクト属性とC言語のデータ型の間で変換するには、次の項で説明する文を使用します。