L2/L5 コマンド(物理順レコード読み込み)

このドキュメントでは、次のトピックについて説明します。


機能および使用

L2 コマンドは、データストレージに物理順に格納されたレコードセットからレコードを読み込むのに使用します。マルチフェッチ機能を使用することによって、単一の L2/L5 コマンドで複数のレコードを読むこともできます。

マルチフェッチ機能を使用しない

L2 コマンドでは、論理順にレコードを読み込むことはできません(レコードが初めから特別な論理的順序でロードされ、この順序を変更するようなファイル更新が行われていない場合は、その限りではありません)。

L2 コマンドは、アソシエータをアクセスする必要はない(L3 コマンドは必要)ので、最適スピードでファイル全体を読み込むのに使用できます。全物理ブロックが順番に読み込まれます。

ユーザーは、読み込むファイルと、値を取得する各レコード内のフィールドを指定します。そのフィールドをフォーマットバッファに指定します。レコードバッファには、要求されたフィールド値が返されます。

L5 コマンドは、L2 コマンドと同じ機能を実行するのに加えて、レコードを共有または排他的ホールド状態にします。つまり、他のユーザーに対してレコードをロックします。L5 コマンドは、ユーザーがレコードを更新したい場合など、他のユーザーがレコードを更新できないようにする必要がある場合に使用します。詳細については、「概念および機能」の「競合更新、共有ロックおよび階層ロック」を参照してください。ユーザーがすでにレコードの共有ロックを保持していて、排他的ロックを要求した場合、ロックは排他的ロックモードにアップグレードされます。ユーザーが既にレコードの排他的ロックを保持している場合、ロックモードは変更されません。

このコマンド ID の前のコマンドが、「Q」オプションで発行され、かつその後にレコードの読み込みが共有ホールド状態から解放されていない場合、このレコードの読み込みは、次の例外を除き、再び共有ホールド状態から解放されます。

  • 複数のコマンドシーケンスでコマンドオプション "Q" を使用して同じレコードが読み込まれた場合、これらのすべてのコマンドシーケンスのために次のレコードが読み込まれた場合または RC が実行された場合のみレコードが解放されます。

  • 別のコマンドが同じレコードを排他的にロックしている場合、またはコマンドオプション "S" を使用してレコードが共有ロックされている場合、レコードは解放されません。

マルチフェッチ機能の使用

L2/L5 コマンドはマルチフェッチ機能をサポートします。マルチフェッチ機能は、コマンドオプション 1 フィールドの M または O のいずれかの値によって表します(詳細については、コマンドオプション 1 フィールドの説明参照)。

マルチフェッチ機能を使用するときは、1 つの L2/L5 コールに返されるレコードの最大数が、次の要因によって制限されています。

  • ISN 下限フィールドを使用すると、返されるレコードの最大数を指定できるため、必要なレコード数が限られている場合に内部オーバーヘッドを低減することができます。

  • ISN 下限フィールドの値が 0 の場合は、返されるレコードの数が ISN/マルチフェッチバッファおよびレコードバッファのサイズによってのみ制限されます。

graphics/l2l5_1.png

L2/L5 Command, Procedure Flow

graphics/l2l5_2.png

L2/L5 Procedure Flow (continued)

コントロールブロック

Field フォーマット  
コールタイプ B F/U
予約(内部使用)   -/-
コマンドコード A F/U
コマンド ID B F/U
File Number B F/U (1)
Response Code B F/A (1)
ISN B F/A
ISN 下限 B F/U
フォーマットバッファ長(ACB のみ) B F/U
レコードバッファ長(ACB のみ) B F/U
ISN バッファ長(ACB のみ) B F/U
コマンドオプション 1 A F/U
コマンドオプション 3(ACBX のみ) A F/U
アディション 2 A、B -/A
アディション 3 A F/A
アディション 5 A F/U
コマンドタイム B -/A
ユーザーエリア   F/U

バッファエリア

バッファ  
フォーマットバッファ F/U
レコードバッファ –/A
サーチバッファ –/–
バリューバッファ –/–
ISN バッファ –/A
フォーマット:
A 英数字
B 2 進数
x/y Adabasコール前/後 - xとyは、値を取ることができます。
A Adabas によって設定
F ユーザーによって設定
U Adabas コール後も変更なし
- 使用しません

(1)このフィールドの意味は、Call タイプに指定された値によって異なります。詳細については、「Adabas の呼び出し」の「コントロールブロック」を参照してください。

コントロールブロック

コマンドコード

L2/L5

コマンド ID

このフィールドには、空白以外でゼロ以外の値を指定する必要があります。このフィールドは、Adabas が正しい物理順でレコードを返し、フォーマットバッファを繰り返し解釈するのを避けるために使用されます。この値は、ファイルの順次読み込み処理中は変更しないでください。

コマンド ID の自動生成を使用するとき以外、このフィールドの上位バイトを 16 進数の FF に設定しないでください(詳細については、「プログラミングの考慮事項」の「コマンド ID の使用」を参照)。

このフィールドの上位バイトには、16 進数 "FF" をセットしないでください。

File Number

読み込むファイルの番号です。

Response Code

このフィールドには、コマンドに対するレスポンスコードが返されます。レスポンスコード 0 は、このコマンドが正しく実行されたことを示します。

レスポンスコード 3 は、エンドオブファイル条件に合ったことを示します。他にレスポンスコード 17、18、21、23、145 が返される可能性があります。

マルチフェッチ機能を使用しているとき、先頭レコードの処理前または処理中にエラーが発生した場合は、このフィールドにレスポンスコードが返されます。この場合、ISN バッファおよびレコードバッファの内容は未定義です。

マルチフェッチ機能の処理ループ中に 2 番目以降の ISN でエラーが検出された場合、最初のゼロ以外のレスポンスコードによってマルチフェッチ処理が終了します。この場合、レスポンスコードは、コントロールブロックのレスポンスコードフィールドではなく、ISN バッファ自体の追加エントリとして格納されます。レスポンスコードの場所は 2 つ考えられるため、アプリケーションプログラムでは、一般的な内容のエラーについて最初にコントロールブロックのレスポンスコードフィールドをチェックし、次に各 ISN バッファエントリのレスポンスコードフィールドを個々にチェックしてください。

ISN

このフィールドを最初の L2/L5 コールの前にゼロにセットすると、ファイルの第 1 物理ブロック内の第 1 レコードから順次読み込みが開始されます。

このフィールドを最初の L2/L5 コールの前に ISN 値に設定すると、指定された ISN のレコードに対して物理的に直後にあるレコードから順次読み込みが開始されます。指定 ISN はファイル中に存在しなければなりません。存在しないと、レスポンスコード 23 が返ります。

ユーザーは、このフィールドを初めの L2/L5 コール後に修正する必要はありません。

このフィールドには読み込んだレコードの ISN が返されます。

マルチフェッチ機能を使用すると、コントロールブロックに返される ISN は、読み込まれる最初のレコードの ISN になります。

ISN 下限

マルチフェッチ機能を使用する場合は、このフィールドを使用して、返されるレコードの数を制限します。このフィールドをゼロに設定した場合、返されるレコードの最大数は、レコードバッファや ISN バッファのサイズによって異なります。

フォーマットバッファ長(ACB のみ)

フォーマットバッファ長(バイト単位)を示します。ユーザープログラムで定義するフォーマットバッファエリアは、ここに指定する長さ以上である必要があります。

レコードバッファ長(ACB のみ)

レコードバッファ長(バイト単位)を示します。ユーザープログラムで定義するレコードバッファエリアは、ここに指定する長さ以上である必要があります。

ISN バッファ長(ACB のみ)

ISN バッファ長(バイト単位)を示します。ISN バッファの長さが 20 バイト未満の場合は、マルチフェッチ機能が無視されます。

このフィールドは、マルチフェッチ機能と組み合わせてのみ使用されます。

コマンドオプション 1

このフィールドに R を指定すると、RETURN オプションを使用することを示します。L5 コマンドを発行し、読み込んでホールドするレコードが現在他のユーザーにホールドされている場合は、Adabas が、レコードが使用可能になるまでユーザーを待ち状態にしないでレスポンスコード 145 を返します。

このフィールドに M を指定すると、マルチフェッチ機能を呼び出します。マルチフェッチ機能に関する詳細については、「プログラミングの考察」の「マルチフェッチ機能の使用」を参照してください。

マルチフェッチ機能に RETURN オプションが必要な場合は、M の代わりに O を指定します。

コマンドオプション 3(ACBX のみ)

コマンドオプション 3 は、L5 コマンドにのみ関係します。

このフィールドの "C" は、コマンドがアクティブな間のみこのレコードの共有ロックか取得されることを示しています。レコードが事前に既にロックされている場合は、レコードはロックされたままになります。このオプションを使用すると、ダーティリードが回避され、レコードのコミット済みの状態のみが表示されます。

このフィールドの "S" は、レコードが共有ホールド状態になることを示しています。現在のトランザクションがコミットまたはバックアウトされたときにロックは再び解除されます。コマンドがサブトランザクションに属している場合、現在のサブトランザクションがバックアウトされたときにロックも解除されます。RI コマンドを使用してロックを解除することもできます。

このフィールドの "Q" は、レコードが共有ホールド状態になることを示しています。この読み込みシーケンスの次の順次読み込みコマンドの開始時か、"S" オプションを使用したレコードの読み込みを解放するイベントの発生時か、どちらかが先に発生したときに、ロックが再び解放されます。"Q" オプションを使用した複数のコマンドによって同じレコードが読み込まれた場合、これらのすべてのコマンドシーケンスに対して、次のレコードが読み込まれるか、RC コマンドが発行されたときにのみレコードが解放されます。"S" オプションが指定された別のコマンドによって同じレコードが読み込まれた場合またはレコードが排他的にロックされた場合は、コマンドシーケンスの次のレコードを読み込んでもレコードは解放されません。"Q" オプションは、コマンドオプション 1 = ‘M’(マルチフェッチ機能)と組み合わせて指定することはできません。

このフィールドが空白のときは、レコードが排他的にロックされていることを示します。

アディション 2

コマンドが正しく実行され、かつ少なくとも 1 つの Adabas フィールドがフォーマットバッファで要求されている場合、Adabas は、アクセスしたデータストレージレコードの圧縮レコード長を、このフィールドの先頭 2 バイトにバイナリ形式で返します。下位 2 バイトには、フォーマットバッファで選択した非圧縮フィールドの長さがバイナリ形式で格納されます。マルチフェッチ機能を使用している場合、この情報は最初に読み込まれたレコードを示します。

このフィールドには、一部のレスポンスコードについて詳細情報が返されます。詳細については、『Adabas メッセージおよびコードマニュアル』を参照してください。

アディション 3

セキュリティ保護のためのパスワードを指定します。

使用するファイルがセキュリティ保護されていない場合、このフィールドは空白にしておきます。ファイルがセキュリティ保護されている場合は、ユーザーは該当するパスワードを指定する必要があります。

指定したパスワードを保護するため、このフィールドはコマンド処理時に空白にセットされます。

アディション 5

このフィールドには、このコマンド用の内部フォーマットバッファを識別する別のフォーマットバッファ ID を指定するか、グローバルフォーマットバッファ ID を指定します。

アディション 5 フィールドの先頭バイトが英数字でなければ、コマンド ID フィールドに指定された値をフォーマットバッファ ID としても使用できます。

先頭バイトが小文字の場合は、アディション 5 フィールドの 5 バイト目から 8 バイト目までが別のローカルフォーマットバッファ ID として使用されます。

先頭バイトが数字または大文字の場合は、アディション 5 フィールド(8 バイト)が別のグローバルフォーマットバッファ ID として使用されます。つまり、フォーマットバッファ ID は、複数のユーザーが同時に使用できます。

詳細および例については、「プログラミングの考慮事項」の「コマンド ID の使用」を参照してください。

フォーマットバッファ

このバッファには、値を取得するフィールドを指定します。フォーマットバッファの構文および例については、「Adabas の呼び出し」の「フォーマットバッファとレコードバッファ」を参照してください。

フォーマットバッファは、最初の L2/L5 コマンドを発行した後には変更できません。

レコードバッファ

このバッファには、要求されたフィールド値が返されます。全フィールド値は、特にフォーマットバッファに別な長さやフォーマットを指定している場合を除いて、各フィールドの標準長および標準フォーマットに従ってフィールド値が返されます。

マルチフェッチ機能を使用しているときは、レコードバッファに、複数のレコードから返されるデータを含めることができます。レコードバッファは複数のエントリで構成され、それぞれのエントリには、単一レコードからの要求フィールド値が格納されます。返されるエントリの数、および各エントリの長さは、ISN バッファ内の対応するエントリに格納されます。

ISN バッファ/マルチフェッチバッファ

マルチフェッチ機能を ACB インターフェイスで使用すると、ISN バッファにはレコードバッファに返されるエントリの説明が格納されます。マルチフェッチ機能を ACBX インターフェイスで使用する場合は、マルチフェッチバッファが代わりに使用されます。

各バッファの最初の 4 バイトは、そのバッファに続く 16 バイトのエントリ数を指定します。各 16 バイトのエントリはレコードバッファに返されたエントリと対応し、次の符号なし整数の値(各 4 バイト長)を含みます。

  • レコードバッファ内のエントリの長さ

  • レコードバッファのエントリに対するレスポンスコード(コントロールブロックのレスポンスコードフィールドの値と異なることがある)
    この値が 0 以外の場合は、マルチフェッチ処理を終了させるエラーが発生したことを意味します。この場合、レコードバッファに対応するエントリはありません。

  • ISN

  • 未使用フィールド

その他の考慮事項

L2/L5 コマンドを使用する場合は、以下の事項も考慮しなければなりません。

  1. L2/L5 コマンドで指定したコマンド ID は、Adabas により内部的に保存され、使用されます。この ID は、エンドオブファイル条件が検出されるか、RC コマンドか CL コマンドが発行されるか、Adabas セッションが終了したときに解放されます。同じコマンド ID は、解放されるまで他の読み込みシーケンシャルコマンドでは使用できません。

    コマンド ID はグローバルトランザクション終了時に解放されません(詳細については、『管理マニュアル』を参照してください)。

  2. ユーザーは L2/L5 コマンドで読み込んだレコードを更新または削除することができます。Adabas は、ユーザーに返すべき次のレコードについての情報を保持しており、このユーザーがその間レコード更新または削除を行っても、正確に次のレコードを返すことができます。ただし、いずれかのファイルの順次読み込み中に同一レコードを重複して受け取る可能性があります。

  3. L2/L5 コマンドで読み込まれたファイルを他のユーザーが更新しようとした場合、または L2/L5 コマンドを実行しているユーザーが、現在 L2/L5 コマンドで読み込まれているレコード以外のファイル内のレコードを更新または削除しようとした場合、L2/L5 コマンドで読み込んでいるユーザーがファイル内の一部のレコードを取得できない、または 1 つのレコードを複数回取得する可能性があります。

例 1:

ファイル 2 を物理順に読み込みます。各レコードの全フィールド値が返されます。

コントロールブロック:

Command Code          L2
Command ID            EXL2 (non blank CID required)
File Number           2
ISN                   0 (all records are to be read)
Format Buffer Length  3 (or larger)
Record Buffer Length  49 (or larger)
Command Option 1      b (Return option not used)
Additions 3           Password (file 2 is security protected)

バッファエリア:

Format Buffer         RG.

L2 コールを繰り返して各レコードを取得します。ISN フィールドをコール間で修正する必要はありません。

例 2:

ファイル 2 を物理順に読み込みます。フィールド RA、XA、および XB(3 バイトのアンパック)の値を返します。読み込んだ各レコードは、更新のためホールド状態になります。

コントロールブロック:

Command Code          L5
Command ID            EXL5 (non blank CID is required)
File Number           2
ISN                   0 (all records are to be read)
Format Buffer Length  13 (or larger)
Record Buffer Length  21 (or larger)
Command Option 1      b (Return option not used)
Additions 3           Password (file 2 is security protected)

バッファエリア:

Format Buffer         RA,XA,XB,3,U.

L5 コールを繰り返して各レコードを取得します。ISN フィールドを L5 コール間で修正する必要はありません。

ホールドした各レコードは、ET コマンド(ET ロジックユーザーの場合)または BT、RI コマンド(非 ET ロジックユーザーの場合)によって解放すべきです。