このセクションでは、コールをプログラミングするときに考慮する必要のある概念について説明します。
内部 ID を指定すると、Adabas コマンドの実行時に重要な機能を実行できます。 Adabas ダイレクトコールコマンドのコントロールブロックで、次の ID を指定できます。
コマンド ID(ACBCID または ACBXCID)。 これは、ACB または ACBX に指定される空白でもゼロでもない値で、コマンド処理の内部 ID として機能します。 コマンド ID を使用すると、同じフォーマットバッファを使用する一連のコマンドで解釈および変換が繰り返されるのを排除できます。
フォーマット ID。 これは、デコード結果のフォーマットバッファに固有の 4 バイトの内部 ID で、ユーザー固有のものにすることも、同じ Adabas ニュークリアスで実行している他のユーザーもグローバルに使用可能なもの(グローバルフォーマット ID)にすることもできます。
フォーマット ID の使用については、このセクションで詳しく説明します。
このセクションでは、これ以外に、Adabas ワークから ISN を取得するための手順、マルチフェッチオプション、およびプリフェッチオプションについても説明します。 マルチフェッチおよびプリフェッチオプションを使用すると、Adabas コールの完了に必要なシステムコマンドの数が減るため、大量のデータを順次処理するプログラムの実行時間を短縮できます。
このドキュメントでは、次のトピックについて説明します。
Adabas コントロールブロック(ACBCID または ACBXCID)に指定されているコマンド ID は、Adabas コマンド実行中に重要な機能を果たします。 コマンド ID は、自動生成されるか、またはユーザーが指定する空白でもゼロでもない値であり、次の機能を実行します。
デコード結果のレコードフォーマットの内部 ID として機能し、フォーマットバッファのデコーディングの繰り返しを防ぎます。
後でアクセスできるように、Sx コマンドが生成した ISN リストにタグを付け、ISN リストのオーバーフローを防ぎます。
レコードセットの順序読み込み処理にタグを付けて識別できるようにします。
必要に応じて、デコード結果のフォーマットバッファに固有の内部フォーマット ID を指定できます。 この値は、アディション 5 フィールドの先頭バイトの上位(左端)2 ビットにあるフラグで識別されます。 フォーマット ID は、フラグの値に応じて、ユーザー固有のもの(個別のフォーマット ID)にすることも、同じ Adabas ニュークリアスで実行している他のユーザーも使用可能なもの(グローバルフォーマット ID)にすることもできます。
このセクションでは、次のトピックについて説明します。
次の表は、コマンド ID、フォーマット ID、およびグローバルフォーマット ID を指定するのに必要な Adabas コントロールブロック(ACB または ACBX)設定をまとめたものです。
ID | ACB または ACBX フィールド指定 | |
---|---|---|
コマンド ID(ACBCID または ACBXCID) | アディション 5(ACBADD5 または ACBXADD5) | |
コマンド ID | このフィールドには空白でもゼロでもない値を指定してください。
X'FFFFFFFF' のコマンド ID 値を指定すると、X'00000001' から始まって 1 ずつ増加するコマンド ID が Adabas によって自動生成されます。 |
バイナリの "00" に設定される上位(左端)ビット |
フォーマット ID | このフィールドには空白でもゼロでもない値を指定してください。
X'FFFFFFFF' のコマンド ID 値を指定すると、X'00000001' から始まって 1 ずつ増加するコマンド ID が Adabas によって自動生成されます。 |
先頭バイトの上位(左端)2 ビットをバイナリの
"10" に設定します。5~8 番目のバイトをフォーマット ID に設定します。 フォーマット ID を
X'FE' および X'FF' で始めることはできません。
非メインフレーム Adabas 環境では、アディション 5 フィールドの先頭バイトを任意の小文字に設定します。 |
グローバルフォーマット ID | このフィールドには空白でもゼロでもない値を指定してください。
X'FFFFFFFF' のコマンド ID 値を指定すると、X'00000001' から始まって 1 ずつ増加するコマンド ID が Adabas によって自動生成されます。 |
先頭バイトの上位(左端)2 ビットをバイナリの
"11" に設定します。残りのバイトをグローバルフォーマット ID に設定します。 アディション 5
フィールドの 8 バイトはすべて、グローバルフォーマット ID として使用されます。
メインフレーム環境では、16 進の E2~E9(文字 S~Z)の範囲に先頭バイトを割り当てることができます。それ以外の範囲は、Software AG によって使用されるために予約されています。 非メインフレーム Adabas 環境では、16 進の 51~5A(文字 S~Z)の範囲に先頭バイトを割り当てることができます。 |
注意:
読み込みシーケンシャルコマンド(L2/L3、L5/L6、L9)には、コマンド ID を指定する必要があります。 Adabas が正しい順序でユーザーにレコードを返すには、コマンド ID が必要です。 これらのコマンド ID は、シーケンシャルコマンドのテーブルに保持されます。
別のフォーマット ID を使用しない限り(「コマンド ID とフォーマット ID に別々の ID 値を使用」セクションを参照)、これらのコマンドで使用するコマンド ID 値も、内部フォーマットバッファプールに入力され、保持されます。 順次読み込み処理中にエンドオブファイル条件が検出されると、コマンド ID は解放されます。
読み込みコマンド(L1~L6、L9)および更新コマンド(A1/A4、N1/N2)では、読み込むフィールドまたは更新するフィールドを指定するフォーマットバッファが必要です。 このフォーマットバッファは、Adabas によって解釈され、内部フォーマットバッファに変換されます。 有効なコマンド ID を使用すると、同じフォーマットバッファを使用する一連のコマンドで解釈と変換が繰り返されるのを防ぐことができます。
読み込みコマンドまたは更新コマンドに有効なコマンド ID を指定すると、Adabas はそのコマンド ID が内部フォーマットバッファプールにあるかどうかチェックします。 コマンド ID がある場合、そのコマンド ID に対応する内部フォーマットバッファが使用されるため、フォーマットバッファを再度解釈する必要がなくなります。
注意:
同じフォーマットバッファを使用する一連のレコードを読み込んだり、更新したりする場合、コマンド ID
を使用すると、読み込みコマンドや更新コマンドの処理時間を大幅に短縮できます。
L9 コマンドから生じた内部フォーマットバッファ(およびフォーマット ID)は、別の L9 コマンドでのみ使用できます。 また、L9 コマンドでは、L9 以外の内部フォーマットバッファ/フォーマット ID を使用することはできません。 このことは、グローバルフォーマットバッファ(およびグローバルフォーマット ID)と L9 コマンドについても言えます。
同じフィールドを読み込んで更新する場合(例えば、L5 の後に A1 が続く場合)、両コマンドに同じコマンド ID を使用することをお勧めします(読み込みと更新に同じフォーマットバッファを使用する場合の制限については、A1/A4 コマンドと N1/N2 コマンドの説明を参照)。
S1/S2/S4 コマンドで第 1 検索レコードを読み込むオプションを使用し、かつコマンド ID を指定すると、コマンド ID とそれに対応する内部フォーマットバッファも内部フォーマットバッファプールに格納されます。
内部フォーマットバッファプールが一杯になり、プールに存在しないコマンド ID のコマンドを受け取ると、Adabas はプール内で最も長く使用されていないエントリを新たに解釈されたフォーマット ID に置き換えます。 その後、削除したコマンド ID を使用するコマンドを受け取ると、そのコマンド ID 用に再度解釈されたフォーマットバッファが、プール内で次に長く使用されていないエントリと置き換えられます。 このため、フォーマットバッファは、同じコマンド ID を使用する一連の読み込みコマンドまたは更新コマンド間で変更しないでください。 なお、コマンド ID を使用しても、フォーマットバッファが再解釈されないことは保証されません。
コマンド ID とフォーマット ID に別々の値を使用できます。 アディション 5 フィールドの上位 2 ビットにバイナリの 00 を設定している限り、コマンド ID は自動的にフォーマット ID として使用されます。 しかし、アディション 5 フィールドの上位 2 ビットがバイナリの 10 であると、フィールドの 5~8 バイト(アディション 5+4(4))はフォーマット ID として使用されます。 ID を X’FE’ および X’FF’ で始めることはできません。
注意:
コマンド ID とは異なるフォーマット ID を識別するために、非メインフレーム Adabas 環境では、アディション 5
フィールドの先頭バイトは小文字であるとみなされます。 異種環境で別のフォーマット ID を使用するときは、システムで使用している全プラットフォームでもその
ID を識別できることが重要です。
オンライン環境で特にみられることですが、複数のユーザーが同じプログラムを使用して 1 つのファイルの同じフィールドを読み込み、更新し、フォーマットバッファも同じものを使用するということがよくあります。
個別のフォーマット ID オプションを使用すると、Adabas はユーザーごとに同じ内部フォーマットバッファを格納します。
グローバルフォーマット ID オプションを使用すると、多くのユーザーが 1 つの内部フォーマットバッファを共有でき、Adabas が内部フォーマットバッファプールのエントリを書き換える必要がなくなります。 このオプションにより、各ユーザーの指定するフォーマットバッファは(フォーマット ID と端末 ID で識別するのではなく)フォーマット ID でのみ識別されます。 コマンド ID をグローバルフォーマット ID として指定することはできません。また、L9 フォーマットとその ID は他の L9 コマンドでしか使用できないという制限は、グローバルフォーマットや ID にも適用されます。
グローバルフォーマット ID オプションを有効にするには、アディション 5 フィールドの先頭バイトの上位 2 ビットにバイナリの 11 を設定します(「コマンド ID、フォーマット ID、およびグローバルフォーマット ID の指定」を参照)。 これにより、アディション 5 の 8 バイトはすべて、グローバルフォーマット ID として認識されます。
注意:
フォーマット ID をグローバルとして識別するために、非メインフレーム Adabas 環境では、アディション 5
フィールドの先頭バイトは任意の数字か小文字であるとみなされます。 異種環境でグローバルフォーマット ID
を使用するときは、システムで使用しているどのプラットフォームでもその ID を識別できることが重要です。
グローバルフォーマット ID の先頭バイトは、16 進の E2~E9(文字 S~Z)の範囲に割り当てることができます。 それ以外の範囲は、Software AG によって使用するために予約されています。
非メインフレーム Adabas 環境でグローバルフォーマット ID に許可されている値の範囲は、16 進の 51~5A(文字 S~Z)です。
注意: Adabas はグローバルフォーマット ID の割り当てを確認しません。 正当な範囲のグローバルフォーマット ID のみが割り当てられるようにするのは、ユーザーの責任です。 Software AG は、ユーザーに有効なグローバルフォーマット ID の範囲を拡張することも、グローバルフォーマット ID 割り当ての問題を解決するためにその製品に変更を行うこともできません。 |
グローバルフォーマット ID を削除するには、RC コマンドを使用し、アディション 5 フィールドにそのグローバルフォーマット ID を指定します。
ISN リストを返すコマンド(S1、S2、S4、S5、S8、S9)にコマンド ID を指定した場合、後でそのコマンド ID 値を使用してリストを識別できます。
Sx コマンドで SAVE ISN LIST オプションを使用する場合は、コマンド ID を指定する必要があります。 SAVE ISN LIST オプションにより、ISN リストがすべて Adabas ワークに格納されます。 リスト内の ISN は、後で Sx コマンドまたは L1/L4 コマンドの GET NEXT オプションを使用して読み取ることができます。
SAVE ISN LIST オプションを使用せず、ISN バッファオーバーフローが発生した(ISN リスト全体が ISN バッファに収まらない)場合、コマンド ID 値を使用したときに限り、オーバーフローした ISN は Adabas ワークに格納されます。 この場合、コマンド ID とそれに対応する ISN リストは、ISN をすべてユーザーに返した時点で解放されます。
コマンド ID 値に X'FFFFFFFF' を指定すると、コマンド ID を自動的に生成できます。 これにより、X'00000001' から始まって 1 ずつ増加するコマンド ID が Adabas ニュークリアスによって自動生成されます。 ただし、コマンド ID の自動生成が望ましくないこともあります。詳細については、「読み込み、更新および検索コマンドで使用するコマンド/フォーマット ID」セクション参照してください。
コマンド ID とその関連エントリ(ISN リスト)を解放するには、RC コマンドまたは CL コマンドを使用します。この他、Sx コマンド(S1、S2、S4、S5、S8、S9)の CID 解放オプションで解放することもできます。
RC コマンドには、内部フォーマットバッファプール、シーケンシャルコマンドテーブル、または ISN リストテーブルにあるコマンド ID のみを解放するオプションがあります。
CL コマンドでは、そのユーザーに対して現在アクティブであるコマンド ID をすべて解放します。
Sx コマンドに CID 解放オプションを指定すると、まずコマンド ID を解放してからコマンド処理を実行します。
各コマンド ID エントリは、コマンド ID 値と 内部ユーザー ID で識別されます。 このため、他のユーザーが使用中のコマンド ID 値を意識する必要はありません。 ただし、同じコマンド ID 値を異なるコマンドで使用するのは避けてください。特に、L2/L5、L3/L6、L9 の各読み込みシーケンシャルコマンドと Sx コマンドでは同じコマンド ID を使用しないことをお勧めします。
このセクションでは、次のトピックについて説明します。
レコードセットを選択し、読み込みます。 読み込むレコードごとに同じフォーマットバッファを使用します。
FIND (S1) CID=EX1A READ (L1) CID=EX1B READ (L1) CID=EX1B
L1/L4 コマンドの GET NEXT オプションを使用してレコードセットを選択し、読み込みます。
FIND (S1) CID=EX2A READ (L1) CID=EX2A READ (L1) CID=EX2A READ (L1) CID=EX2A
ファイルを順次読み込んで、更新します。 読み込みと更新で同じフォーマットバッファを使用します。
READ PHYS SEQ (L5) CID=EX3A UPDATE (A4) CID=EX3A READ PHYS SEQ (L5) CID=EX3A UPDATE (A4) CID=EX3A
ファイルを論理順に読み込みます。 第 1 ファイルから読み込んだフィールドの値を使用して、第 2 ファイルに検索コマンドを発行します。次に、GET NEXT オプションを使用して、検索コマンドで取得したレコードを読み込みます。
READ LOG SEQ (L3) CID=EX4A FIND (S1) CID=EX4B READ (L1) CID=EX4B READ (L1) CID=EX4B READ LOG SEQ (L3) CID=EX4A FIND (S1) CID=EX4B READ (L1) CID=EX4B
このセクションでは、Adabas WORK データセットから ISN を読み込む手順について説明します。 L1/L4 コマンドの GET NEXT オプションを使用して、ISN リスト中の ISN に対応するレコードを読み込む場合は、このセクションで説明する ISN 処理を Adabas が自動的に行うため、ユーザーがその手順を使用する必要はありません。
このセクションで使用する Sx コマンドとは、ISN リストを生成するコマンド(S1/S2/S4/S5/S8/S9)のことです。
このセクションでは、次のトピックについて説明します。
Adabas は次のいずれかの条件があてはまる場合、ISN を WORK データセットに格納します。
Sx コマンドが発行され、空白/ゼロ以外のコマンド ID が指定され、SAVE ISN LIST オプションが指定されています。 この場合、ISN 結果リスト全体が格納されます。
Sx コマンドが発行され、空白/ゼロ以外のコマンド ID が指定され、SAVE ISN LIST オプションが指定されず、ISN 結果リストが ISN バッファの許容量を超えています。 この場合、あふれた ISN のみが格納されます。
コマンド ID フィールドに空白かバイナリの 0 を指定して Sx コマンドを発行すると、Adabas は ISN を Adabas ワークに格納しません。
Adabas WORK データセットに格納されている ISN を取得するには、最初の Sx コマンドに使用したのと同じコマンド ID 値を指定して Sx コマンドを発行します。 アクティブなコマンド ID 値を指定して Sx コマンドを発行すると、Adabas は既存の ISN リストに ISN を要求しているものとみなします。 Adabas は指定のコマンド ID で識別される ISN リストを探し出し、次の ISN グループを ISN バッファに入れます。 ISN バッファに入るだけの ISN が返されます。
このセクションでは、次のトピックについて説明します。
ISN リストの作成に使用する Sx コマンドで SAVE ISN LIST オプションを指定した場合、Adabas は ISN 下限フィールドに指定された ISN を使用して次に返す ISN グループを判断します。
ISN 下限フィールドに指定された ISN より次に大きい ISN で始まるものが、次のグループになります。
ISN 下限フィールドにバイナリの 0 を指定した場合、リスト内の先頭 ISN で始まるものが、次のグループになります。
リストのどの ISN よりも大きい値を指定すると、レスポンスコード 25 が返されます。
S2 コマンドを使用して ISN リストを作成した場合、指定する ISN は ISN リストに存在している必要があります。 このように SAVE ISN LIST オプションを使用すると、ユーザーは ISN リスト内を前後にスキップできます。 このことは、画面を前後にスクロールする操作をプログラムで実現するのに役立ちます。
ISN リストの作成に使用した Sx コマンドに SAVE ISN LIST オプションを指定しなかった場合、Adabas はリスト内の配置順で ISN を返します。Adabas ワークからの各 ISN グループをユーザーの ISN バッファに入力し終えると、Adabas はこの ISN リストを削除します。 リストの識別に使用されたコマンド ID も、ISN の最後のグループがユーザーに返されたときに解放されます。 この場合、指定した ISN 範囲を超えて処理が始まらない限り、ISN 下限フィールドは使用されません。
コントロールブロック内の ISN 数フィールドを使用すると、ユーザーはリスト内の ISN の取得が完了した時点を判断できます。
最初の Sx コマンドでは、検索条件を満たすレコードの総数をこのフィールドに返します。
また、Adabas ワークから ISN を取得するのに使用する後続の各 Sx コマンドでは、このフィールドを使用して、ISN バッファに挿入された ISN の番号を格納します。
このセクションでは、次のトピックについて説明します。
Sx command L1/L4 command with 'GET NEXT' option L1/L4 command with 'GET NEXT' option L1/L4 command with 'GET NEXT' option
次の各例では、ISN バッファのサイズによって、さまざまな結果が得られることを示しています。 ISN リストの配置は ISN 下限で定義します。
ISN Buffer Length = 0 read the ISN list to the work area
L1/L4 with GET NEXT result: first ISN's record
ISN Buffer Length = 4 read first ISN with S1
L1/L4 with GET NEXT result: second ISN's record
ISN Buffer Length = 12 read first ISN with S1 first 3 ISNs are returned in ISN buffer
L1/L4 with GET NEXT result: read fourth/fifth/sixth ISNs' records
SAVE ISN LIST オプションを使用した最初の Sx コール
Command = Sx Command ID = SX01 (save-ISN-list option) Command Option 1 = H ISN Lower Limit = 0 ISN Buffer Length = 20 CALL ADABAS ...
実行結果の ISN 数 = 7(格納リスト内の ISN の総数)
ISN 結果リスト:(ISN はすべてワークに格納されます)
8 12 14 15 24 31 33
実行結果の ISN バッファ:
8 12 14 15 24
後続の Sx コール
Command = Sx Command ID = SX01 ISN Lower Limit = 24 (limit ISN choice to 24, +) ISN Buffer Length = 20 (space for 5 ISNs from ISN list) CALL ADABAS ...
実行結果の ISN 数 = 2(ISN バッファに返された ISN の総数)
実行結果の ISN バッファ:
31 33 14 15 24.... remainder of ISN buffer unchanged....
後続の Sx コール
Command = Sx Command ID = SX01 ISN Lower Limit = 0 ISN Buffer Length = 20 CALL ADABAS ...
実行結果の ISN 数 = 7
実行結果の ISN バッファ:
8 12 14 15 24
最初の Sx コール(SAVE ISN LIST オプションは使用しない)
Command = Sx Command ID = SX02 Command Option 1 = blank (no option) ISN Lower Limit = 0 ISN Buffer Length = 20 CALL ADABAS ...
実行結果の ISN 数 = 7(ISN バッファに返された ISN とワークに格納されている ISN の総数)
ISN 結果リスト:(ISN 31 と 33 のみがワークに格納されています)
8 12 14 15 24 31 33
実行結果の ISN バッファ:
8 12 14 15 24
後続の Sx コール
Command = Sx Command ID = SX02 ISN Lower Limit (not used) ISN Buffer Length = 20 CALL ADABAS ...
実行結果の ISN 数 = 2
実行結果の ISN バッファ:
31 33 14 15 24
31 と 33 の ISN を Adabas ワークから削除し、コマンド ID SX02 を解放します。 最後の ISN がユーザーに返された後で SX02 が解放されたため、コマンド ID を SX02 とした後続の Sx コールは最初の Sx コールとして処理されます。
上記の例では ISN 下限を使用していませんが、ゼロ以外の値を指定すると、その値より大きい ISN のみを ISN バッファに返します(例 2 と同様)。
コマンド ID を空白かゼロとした最初の Sx コール
Command = Sx Command ID = blanks or binary zeros Command Option 1 = blank (no option) ISN Lower Limit = 0 (no lower limit specified) ISN Buffer Length = 20 CALL ADABAS ...
実行結果の ISN 数 = 7(一致した ISN の総数)
ISN 結果リスト:ワークには何も格納されません。
8 12 14 15 24 31 33
実行結果の ISN バッファ:
8 12 14 15 24
後続の Sx コールでコマンド ID を空白かバイナリの 0、ISN 下限を 0 とすると、イニシャルコール時と同じ検索コマンドが再実行され、同じ結果が得られます。 後続のコールでコマンド ID を空白かバイナリの 0、ISN 下限を 24 とすると、Sx コマンドが再実行されます。 その結果、ISN 数=2 となり、ISN バッファには 31 と 33 の ISN が入ります。
大量のデータを順次処理するプログラムは、頻繁にストレージにアクセスする必要があり、実行時間が長くなります。 Adabas マルチフェッチオプションとプリフェッチオプションは、Adabas コールの実行に必要なシステムコマンド数を減らして、このようなプログラムの実行時間を大幅に短縮します。
マルチフェッチオプションとプリフェッチオプションを使用すると、ほぼすべての標準アプリケーションで実行時間が短縮されます。ただし、具体的に得られるメリットはアプリケーションプログラムのタイプによって異なります。
注意:
Adabas 8 の ACBX インターフェイスコールでは、マルチフェッチ機能はサポートされますが、プリフェッチ機能はサポートされません。
ただし、ACB
インターフェイスダイレクトコール用のプリフェッチ機能はサポートされています。したがって、アプリケーションに
ACB
インターフェイスダイレクトコールを使用している場合、これらのコールのみにプリフェッチ機能は、引き続き使用することができます。
このセクションでは、次のトピックについて説明します。
マルチフェッチ機能とプリフェッチ機能は、アプリケーションプログラムと Adabas ニュークリアス間のコミュニケーションオーバーヘッドを削減します。 マルチフェッチ処理は、単一のコールで取得した複数のレコードを格納し、そのレコードをレコードバッファのユーザーに転送します。 マルチフェッチを使用しないと、これと同じ結果を得るには複数の Adabas コールが必要になります。 ACB インターフェイスダイレクトコールを実行すると、マルチフェッチしたレコードのレコードディスクリプタエレメント(RDE)が ISN バッファに格納されます。ACBX インターフェイスダイレクトコールを実行すると、マルチフェッチしたレコードのレコードディスクリプタエレメント(RDE)がマルチフェッチバッファに格納されます。
マルチフェッチ処理はプリフェッチに似ています。実際、マルチフェッチはプリフェッチ機能とその他の機能で構成されています。 Adabas 8 以前のリリースではプリフェッチ処理とマルチフェッチ処理のどちらもサポートしていますが、新規に作成するプログラムでは、どの Adabas プラットフォームでも機能が共通しているマルチフェッチ(M)オプションを使用することをお勧めします。 また、プリフェッチオプションは Adabas 8 以降のリリースではサポートされません。
作成したアプリケーションで ACB インターフェイスダイレクトコールのみを使用している場合、プリフェッチ処理またはマルチフェッチ処理を呼び出すには 2 つの方法があります。 どちらの方法で呼び出すかは、処理するために先読みしたレコードが保管されている場所、およびどんなバッファスペースを割り当てる必要があるかによって決まります。
1 つ目の方法は、ADARUN ステートメントに PREFETCH=YES(マルチフェッチ処理の場合)または OLD(プリフェッチ処理の場合)パラメータを指定します。これは、最も効率のよい方法であり、アプリケーションプログラムを変更する必要がありません。 これらのパラメータでは、バッチジョブを制御できます。
PREFETCH=YES または OLD を指定すると、Adabas はダブルバッファリング技法により、1 つのレコードグループの処理中に次のレコードグループがフェッチされるようになります。
PREFETCH、PREFICMD、PREFIFIL、PREFNREC、PREFSBL、PREFTBL、PREFXCMD、PREFXFIL などプリフェッチ/マルチフェッチに関する ADARUN パラメータの詳細については、「Adabas の初期化(ADARUN ステートメント)」を参照してください。
もう 1 つの方法は、L1/L4、L2/L5、L3/L6、L9、BT または ET コマンドに M または O オプション(マルチフェッチ処理の場合)を指定するか、L1/L4、L2/L5、L3/L6 または L9 コマンドに P オプション(プリフェッチ処理の場合)を指定します。 コマンドレベルオプション M、O、および P の使用については、各コマンドのドキュメントの他、「マルチフェッチ処理」と「プリフェッチ処理」を参照してください。
作成したアプリケーションで ACBX インターフェイスダイレクトコールを使用する場合、または ACB インターフェイスダイレクトコールと ACBX インターフェイスダイレクトコールを混在させる場合、マルチフェッチ処理を呼び出すには、L1/L4、L2/L5、L3/L6、L9、BT、または ET コマンドで M または O オプションを指定する必要があります。 コマンドレベルオプション M および O の使用については、各コマンドのドキュメントの他、「マルチフェッチ処理」を参照してください。
注意:
プリフェッチ処理は、ACBX
インターフェイスダイレクトコールを使用するアプリケーションではサポートされません。
マルチフェッチ処理は、非メインフレームプラットフォーム上の対応する処理と互換性があり、異機種環境の各種プラットフォームで使用できます。
マルチフェッチ処理は、次の Adabas コマンドで使用できます。
I または N オプションを指定した L1/L4(ISN での読み込み、GET NEXT を指定した検索)
L2/L5(物理的な読み込み)
L3/L6(ディスクリプタ順に論理的な読み込み)
L9(ヒストグラム)
BT(トランザクションのバックアウト)
ET(トランザクションの終了)
マルチフェッチは、どの読み出しコール(Lx)に指定した場合でも、ひとまとまりのレコードをレコードバッファに返し、これらのレコードの記述をコール元の ISN バッファ(ACB インターフェイスダイレクトコールの場合)またはコール元のマルチフェッチバッファ(ACBX インターフェイスダイレクトコールの場合)に返します。 レコードの最大数は次の値で制限されます。これらの値は、Adabas コントロールブロック(ACB または ACBX)のいずれか、または ABD に適宜指定されます。
コールへの入力としてユーザーが定義した最大値
レコードバッファ長
ISN バッファ長(ACB インターフェイスダイレクトコール)
マルチフェッチバッファ長(ACBX インターフェイスダイレクトコール)
このセクションでは、次のトピックについて説明します。
読み込みコマンドのダイレクトコールを行うときにマルチフェッチ処理を使用する場合は、コールの前に次のようにフィールドを設定しておく必要があります。
設定内容 | 設定対象 | ||
---|---|---|---|
ACB インターフェイスダイレクトコール | ACBX インターフェイスダイレクトコール | ||
ACB | ACBX | ABD | |
サポートされるコマンドタイプおよびオプション(「マルチフェッチ処理」セクションのコマンドリストを参照) | コマンドコード(ACBCMD) | コマンドコード(ACBXCMD) | --- |
返される値の最大数。すべての値をマルチフェッチする場合は 0 | ISN 下限(ACBISL) | ISN 下限(ACBXISL) | --- |
"M" または O に設定(次の注を参照) | コマンドオプション 1(ACBCOP1) | コマンドオプション 1(ACBXCOP1) | --- |
レコードバッファの長さ | レコードバッファ長(ACBRBL) | --- | レコードバッファ ABD のバッファサイズ(ABDXSIZE) |
ISN バッファの長さ | ISN バッファ長(ACBIBL) | --- | --- |
マルチフェッチバッファの長さ | --- | --- | マルチフェッチバッファ ABD のバッファサイズ(ABDXSIZE) |
注意:
返されるレコードバッファと、ISN バッファまたはマルチフェッチバッファの内容は、次のとおりです。
Record Buffer: record1,record2, ... ,recordn
レコードは通常どおりにレコードバッファに返されます。 複数のレコードが返された場合、そのいずれのレコードもレコードバッファ内で隣接しています。
これらのレコードの記述は ISN バッファに返されます。 ISN バッファの最初のフルワードは、後続のエレメント数を示します(符号付き整数、4 バイト)。 このカウントの後に、16 バイトのレコードディスクリプタエレメントが続きます。
ISN or Multifetch Buffer: RDE count{RDE1 }...
レコードディスクリプタエレメント(RDE)の構造を次の表に示します。
フォーマット | 長さ | 内容 |
---|---|---|
すべてのフィールドは符号なし、右詰 | 4 バイト | レコードバッファ内のこのレコードの長さ。 レコードによって長さが異なることがあります。 |
4 バイト | このレコードの Adabas レスポンス。 ゼロ以外のレスポンスの場合、レコードはレコードバッファに格納されません。 | |
4 バイト | このレコードの ISN。 | |
4 バイト | (L9 のみ)ISN 数:このディスクリプタの値のカウント |
最初のレコードの処理中にエラーが検出されると、レスポンスコードが適切な Adabas コントロールブロック(ACBRSP または ACBXRSP)のレスポンスコードフィールドに返されます。
2 番目以降のレコードの処理中にエラーが検出されると、レスポンスコードが ISN バッファまたはマルチフェッチバッファの対応するレコードディスクリプタエレメントに返されます。
Adabas はデフォルトでは、BT/ET コマンドを発行しているユーザーに対して現在ホールドされている ISN をすべて解放します。 マルチフェッチオプションを指定すると、現在のトランザクションでホールドされているレコードのサブセットのみが解放されます。 ACB ダイレクトコールインターフェイスを使用している場合、ホールド状態から解放されるレコードは ISN バッファに指定されます。ACBX ダイレクトコールインタフェースを使用している場合、ホールド状態から解放されるレコードはマルチフェッチバッファに指定されます。 ISN バッファまたはマルチフェッチバッファ内の最初のフルワードは、次の 8 バイトのエレメントの数になります。
コマンドレベルのマルチフェッチ機能を有効にするには、BT/ET コマンドコールの前に、Adabas コントロールブロックのフィールドに次の値を設定しておく必要があります。
ET コマンドまたは BT コマンドのダイレクトコールを行うときにマルチフェッチ処理を使用する場合は、コールの前に次のようにフィールドを設定しておく必要があります。
設定内容 | 設定対象 | ||
---|---|---|---|
ACB インターフェイスダイレクトコール | ACBX インターフェイスダイレクトコール | ||
ACB | ACBX | ABD | |
"BT" または "ET" | コマンドコード(ACBCMD) | コマンドコード(ACBXCMD) | --- |
"M" | コマンドオプション 1(ACBCOP1) | コマンドオプション 1(ACBXCOP1) | --- |
ISN バッファの長さ | ISN バッファ長(ACBIBL) | --- | --- |
マルチフェッチバッファの長さ | --- | --- | マルチフェッチバッファ ABD のバッファサイズ(ABDXSIZE) |
注意:
ADARUN PREFETCH=YES でマルチフェッチを設定すると、ET/BT コマンドには
"P" オプション(プリフェッチ)が自動的に使用されます。それ以外のコマンドには
"M" オプション(マルチフェッチ)が自動的に使用されます。
ISN バッファまたはマルチフェッチバッファには、次の値が含まれている必要があります。
ISN or Multifetch Buffer: ISN descriptor count {ISN descriptor element (See table below)} ...
ISN ディスクリプタエレメントの構造を次の表に示します。
フォーマット | 長さ | 内容 |
---|---|---|
バイナリ、右詰 | 4 バイト | Adabas ファイル番号 |
4 バイト | ISN |
プリフェッチは、ACB ダイレクトコールインターフェイスを使用してシーケンシャルコマンド(GET NEXT を指定した L1/L4、L2/L5、L3/L6、L9)をコールするプログラムで効果を発揮します。 ACBX ダイレクトコールでは使用できません。
プリフェッチを使用すると、一連の読み込みシーケンシャルコマンドが、1 回の Adabas コールで実行されます。 1 回のコールでデータベースから一度に複数のレコードを読み込みます。 この結果、リージョン間コミュニケーションのオーバーヘッドを大幅に削減し、ユーザープログラムと Adabas ニュークリアス処理をオーバーラップさせることができます。
注意:
ホールドオプション(L4/5/6
コマンド)を使用している場合、レコードがプリフェッチバッファエリアに読み込まれると、そのレコードはホールド状態になります。
つまり、全レコードの処理が完了する前に ET コマンドを発行すると、(未処理のレコードも含め)すべてのレコードが解放されます。 ET コマンドの ISN
ホールドオプションまたは HI コマンドを使用すると、このようなレコードをホールド状態に戻すことができます。
プリフェッチオプション処理から特定のコマンドまたはファイルを除外するには、ADARUN PREFXFIL パラメータまたは PREFXCMD パラメータを使用して、除外するファイルまたはコマンドを指定します。
このセクションでは、次のトピックについて説明します。
コマンド固有の P オプションを指定してプリフェッチを有効にすると、Adabas はユーザープログラム内に定義された ISN バッファを先読みレコード用の中間ストレージエリアとして使用します。 ISN バッファの各レコードには、16 バイトのヘッダーが付きます。
バイト | 使用法 |
---|---|
1~2 | レコード長(長さの定義を含む) 長さ=ゼロはデータの終わりを示します。 |
3~4 | ニュークリアスレスポンスコード |
5~8 | ニュークリアスの内部 ID(レスポンスコードがゼロでも 3 でもない場合、右端 2 バイトにサブコードが返されます) |
9~12 | レコードの ISN |
13~16 | ISN 数(L9 コマンドのみ) |
最初のレコードは、Adabas によってレコードバッファに返されます(16 バイトのヘッダーなし)。 2 番目以降のレコードは、ユーザーが ISN バッファから取り出して処理する必要があります。 エンドオブファイルが発生した場合、ISN バッファの最後のレコードのヘッダーには Adabas レスポンスコード 3 が含まれ、2 バイトの終了文字にはバイナリの 0 が含まれています。
プリフェッチオプションを使用する場合には、次の事項を考慮してください。
レコードバッファサイズは、想定される最大サイズの非圧縮レコードを格納するのに十分な大きさに設定します。
エンドオブファイル条件が検出されるまでファイルの順次読み込みを継続しない場合は、ファイル処理の完了時に RC コマンドを発行してコマンド ID を解放します。
ファイルの処理中は、コマンド ID を変更しないでください。
コマンドオプション P を使用してプリフェッチ処理を実行する場合、ISN バッファサイズはレコードバッファ長に 16 バイトを加えた値の倍数に、さらに終了文字用の 2 バイトを足した大きさにします。
プリフェッチまたはマルチフェッチしたレコードを更新した場合、次の処理が適用されます。
重要:
ファイルでレコードを読み込んだり、検索したりしているときには、その同じファイル(特にアクセスされているディスクリプタ)を変更しないでください。
更新の保護が適用されるのはアクティブなセッションのみであり、それ以外のセッションで実行される処理は保護の対象に含まれません。
プリフェッチまたはマルチフェッチしたレコードの ISN を変更した場合、そのレコードはプログラムがそのレコードに到達したときに(L1 コマンドによって)再度フェッチされます。
プリフェッチまたはマルチフェッチしたレコードの ISN を削除した場合、そのレコードはスキップされます。
プリフェッチまたはマルチフェッチしたレコードの ISN を挿入した場合、そのレコードはスキップされます。 このため、ファイルでレコードを読み込んだり、検索したりしている間は、その同じファイルに変更を加えないことをお勧めします。