L3/L6 コマンド(論理順レコード読み込み)

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


機能および使用

L3/L6 コマンドは、指定ディスクリプタの値の昇順に従ってレコードを論理順に格納されているレコードの集合から読み込むために使用します。マルチフェッチ機能を使用すると、1 つの L3/L6 コマンドで複数のレコードも読み込めます。

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

読みたいファイル、読み込む順序を制御するディスクリプタ(フォネティックディスクリプタは使用できません)、および読みたい値に対する各レコード内のフィールドを指定します。レコードバッファには、要求されたフィールド値が返されます。

オプションとして、値の開始値、終了値、またはその範囲を指定できます。さらに、順次読み込み中にある値に位置付けることにより、ユーザーは各レコードを読む必要はなく、ファイルを通して特定レコードを拾い読みできます。

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

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

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

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

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

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

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

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

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

graphics/l3l6_1.png

L3/L6 Command, Procedure Flow (without Multifetch Feature)

graphics/l3l6_2.png

L3/L6 Command, Procedure Flow (continued (without Multifetch Feature)

コントロールブロック

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
ISN 数 B -/A
フォーマットバッファ長(ACB のみ) B F/U
レコードバッファ長(ACB のみ) B F/U
サーチバッファ長(ACB のみ) B V F/U
バリューバッファ長(ACB のみ) B V F/U
ISN バッファ長(ACB のみ) B F/U
コマンドオプション 1 A F/U
コマンドオプション 2 A F/U
コマンドオプション 3(ACBX のみ)    
アディション 1 A F/A
アディション 2 A、B -/A
アディション 3 A F/A
アディション 5 A F/U
コマンドタイム B -/A

バッファエリア

バッファ  
フォーマットバッファ F/U
レコードバッファ –/A
サーチバッファ V F/U
バリューバッファ V F/U
ISN バッファ –/A
フォーマット:
A 英数字
B 2 進数
x/y Adabasコール前/後 - xとyは、値を取ることができます。
A Adabas によって設定
F ユーザーによって設定
U Adabas コール後も変更なし
V開始値、終了値、または値の範囲が指定されているときに必要
–使用しない

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

コントロールブロック

コマンドコード

L3/L6

コマンド ID

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

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

このフィールドの上位バイトには 16 進数 FF をセットできません。

このフィールドは、ファイルの順次読み込み中に修正しないでください。

1 レコードだけ読む場合は、このフィールドを空白またはバイナリのゼロにセットできます。

File Number

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

Response Code

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

レスポンスコード 3 は、指定したディスクリプタのすべてのエントリが処理されたこと、または終了ディスクリプタ値条件が真になったことを示します。

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

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

ISN

このフィールドは、バリューバッファに指定した開始ディスクリプタ値とともに、最初の L3/L6 コールの開始位置を決定するのに使用します。この場合、複数レコードが(ディスクリプタ値エントリに一致する)同一のディスクリプタ値を持つことができ、値の位置付けが行われます。詳細については、例 5(VALUE START オプションまたは再位置決めオプションの使用例)を参照してください。

このフィールドに 0 を指定すると、開始ディスクリプタ値エントリと一致している範囲内の最小 ISN から読み込みを始めます。

このフィールドに 0 以外を指定すると、開始ディスクリプタ値エントリと一致している範囲内の、コントロールブロックに指定された ISN より次に大きい ISN から読み込みを始めます。開始ディスクリプタ値と一致する ISN の範囲内に次に大きい ISN が存在しない場合は、現在の位置が、次のディスクリプタ値とその最小 ISN(昇順)、または前のディスクリプタ値とその最大 ISN(降順)に移動します。

開始ディスクリプタ値と一致するものがない場合、またはサーチバッファに GT(昇順)または LT(降順)比較演算子が指定されている場合、このフィールドは無視されます。

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

マルチフェッチ機能を使用すると、読み込む最初のレコードは上記のとおりに決められます。この L3/L6 コマンドで読み込む他のレコードの ISN は、使用中の論理順に従って続きます。

ISN 下限

マルチフェッチ機能を使用すると、1 つの L3/L6 コマンドで読み込むレコードの最大数を、このフィールドに指定したレコード数に制限します。値を 0 にすると、ISN バッファのサイズとレコードバッファのサイズによってのみレコード数が制限されます。

ISN 数

求める値のディスクリプタがピリオディックグループのフィールドである場合は、Adabas が、このフィールドに存在する戻り値のオカレンス数を返します。マルチフェッチ機能を使用する場合は、このフィールドが、返される最初のレコードになります。

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

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

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

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

サーチバッファ長(ACB のみ)

開始値、終了値、または範囲値が指定された場合のサーチバッファ長(バイト数)を示します。

バリューバッファに値が指定されていないと、サーチバッファ長は無視されます。

バリューバッファ長(ACB のみ)

開始値、終了値、または範囲値が指定された場合のバリューバッファ長(バイト数)を示します。

サーチバッファが指定されない場合、バリューバッファ長は無視されます。

ISN バッファ長(ACB のみ)

ISN バッファ長(バイト単位)。マルチフェッチ機能を使用するときは必ず指定しなければなりません。長さの計算方法については、ISN バッファの説明を参照してください。

マルチフェッチ機能を使用するときは、レコードバッファに複数のレコードを入れることができます。返されるレコード数および各レコードの長さは、ISN バッファの対応している 1 エントリに格納されます。

コマンドオプション 1

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

このフィールドが M のときは、マルチフェッチ機能が呼び出されます。

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

コマンドオプション 2

指定したディスクリプタのエントリが処理される順を指定します。

このフィールドが A のときは、ディスクリプタ値が昇順で読まれることを示します。必要に応じて開始値、終了値、または範囲値を指定できます。サーチバッファかバリューバッファを省略すると、指定のディスクリプタのすべてのエントリが処理されます。

このフィールドが V のときは、ディスクリプタ値が開始値を使用して昇順で読まれることを示します。サーチバッファおよびバリューバッファは指定しなければなりません。

このフィールドが D のときは、ディスクリプタ値が降順で読まれることを示します。必要に応じて開始値、終了値、または範囲値を指定できます。サーチバッファかバリューバッファを省略すると、指定のディスクリプタのすべてのエントリが処理されます。

このフィールドが空白か上記以外の値のときは、すべてのディスクリプタ値が昇順で処理されることを示します。サーチバッファおよびバリューバッファは指定しても無視されます。

アプリケーションを新規に作成するときは、このフィールドを A にすることを強くお勧めします。V は上位互換性を保証するためにサポートしています。

値に A または D を使用すると、コマンドオプション 2 フィールドの内容を変更するだけで処理を逆順にすることができます。

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

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

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

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

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

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

アディション 1

このフィールドには読み込み順序の制御に使用するディスクリプタを指定する必要があります。ディスクリプタ名は、このフィールドの先頭 2 桁に指定します。1 回目の L3 コール時には、残りの桁を空白にしなければなりません。

フォネティックディスクリプタは指定しないでください。

マルチプルバリューフィールドのディスクリプタは指定できます。その場合、ファイルの順次読み込み中に同一レコードを何回も(あるレコード内の異なる値ごとにつき 1 回)読むことが発生する可能性があります。

指定のディスクリプタが空値省略(NU または NC)オプションで定義されている場合は、ディスクリプタが空値のレコードは読まれません。

サーチバッファを指定する場合は、サーチバッファ内のディスクリプタがアディション 1 フィールドに指定したディスクリプタと同一でなければなりません。

このフィールドは、各 L3/L6 コール間で変更しないでください。この規則の例外は、順次読み込み処理中にユーザーが特定の値に再配置する場合です。このフィールドの最後の 6 つの位置を空白に設定すると、現在の検索およびバリューバッファに従って、開始値と終了値が新しい設定になります。

レスポンス 3 が返る場合は、Adabas が、このフィールドの最後の 6 バイトを空白に設定します。

アディション 2

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

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

アディション 3

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

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

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

アディション 5

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

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

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

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

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

フォーマットバッファ

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

レコードバッファ

このバッファには、要求されたフィールド値が返されます。フィールド値は、特にフォーマットバッファにフォーマット、長さ、またはその両方が指定されていない限り、標準フォーマットおよび標準長に従って返されます。

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

サーチバッファ

取得するディスクリプタの数を制限するために開始値、終了値、またはその両方がバリューバッファで指定された場合のみ、サーチバッファが必要です。

サーチバッファまたはバリューバッファのどちらかを指定しないと、指定したディスクリプタのすべての値が処理されます。

サーチバッファエレメントの列の中では、文字の区切りにコンマを、文字の終了を示すのにピリオドを使用します。

サーチバッファの構文形式については、「Adabas の呼び出し」の「サーチバッファとバリューバッファ」を参照してください。

バリューバッファ

サーチバッファに格納される指定内容に応じて、バリューバッファには開始値または終了値、または範囲の上限と下限が格納されます。

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

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

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

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

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

  • ISN

  • 求める値のフィールドがピリオディックグループのディスクリプタフィールドである場合は、ピリオディックグループ内のオカレンス番号。

その他の考慮事項

L3/L6 コマンドを使用する際は、以下の事項も考慮に入れます。

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

    グローバルトランザクションの終了時には、コマンド ID は解放されません。

  2. L3/L6 コマンドでユーザーが読んでいるファイルからは、レコードを更新することも削除することもできます。Adabas はユーザーに与えた最後のレコードと次に与えるレコードについての情報を保持し、ユーザーがコール間でレコード更新または削除を行っても、正しく次のレコードを返します。

  3. L3/L6 コマンドで読んでいるファイルを他のユーザーが更新している場合は、ファイルの順次読み込み中に L3/L6 コマンドで読んでいるユーザーが受け取るレコードがとんでしまったり、または同じレコードを重複して受け取ったりします。

例 1:

ファイル 2 を論理順に読み込みます。ディスクリプタ RB は順序制御に使用します。フィールド RA および RB の値が返され、ファイル全体が読み込まれます。

コントロールブロック:

Command Code          L3
Command ID            EX01 (a non-blank CID is required)
File Number           2
Format Buffer Length  6 (or larger)
Record Buffer Length  18 (or larger)
Command Option 1      b (Return option not used)
Command Option 2      A
Additions 1           RBbbbbbb  (descriptor  RB  to be used for
                                 sequence control)
Additions 3           Password (file 2 is security protected)

バッファエリア:

Format Buffer         RA,RB.

L3 コールを繰り返して各レコードを取得します。コマンド ID とアディション 1 フィールドは L3 コール間で変更しないでください。全レコードの読み込みが終わると、レスポンスコード 3 が返されます。

例 2:論理順に読んでホールドする

ファイル 1 を論理順に読み込みます。ディスクリプタ AA は順序制御に使用します。フィールド AA と AB の値が返されます。読み込んだ各レコードはホールド状態になります。

コントロールブロック:

Command Code          L6
Command ID            EX02 (non blank CID required)
File Number           1
Format Buffer Length  3 (or larger)
Record Buffer Length  10 (or larger)
Command Option 1      b (Return option not used)
Command Option 2      A
Additions 1           AAbbbbbb  (descriptor  AA  to be used for
                                 sequence control)
Additions 3           bbbbbbbb (file 1 is not security protected)

バッファエリア:

Format Buffer         GA.

読み込んだ各レコードは、ET コマンド(ET ロジックユーザー)、または RI コマンド(非 ET ロジックユーザー)で解放すべきです。

例 3:任意の値から開始する

読み込みを値 N から読み始めることを除けば、例 1 と同じです。

コントロールブロック:

Command Code          L3
Command ID            EX03 (non blank CID required)
File Number           2
ISN                   0 (reading is to start with the lowest ISN that
                         contains the value given in the value buffer)
Format Buffer Length  6 (or larger)
Record Buffer Length  18 (or larger)
Search Buffer Length  7 (or larger)
Value Buffer Length   1 (or larger)
Command Option 1      b (Return option not used)
Command Option 2      A
Additions 1           RBbbbbbb  (RB  is to be used for sequence
                                 control)
Additions 3           Password (file 2 is security protected)

バッファエリア:

Format Buffer         RA,RB.
Search Buffer         RB,1,A. (GE is implicit)
Value Buffer          N (reading to begin with value N)

初めの L3 コマンドで、ディスクリプタ RB に値 N を持つ最初のレコードが返されます。この値を持つレコードが存在しない場合は、N より大きな値(例:NA)を持つ最初のレコードが返されます。

例 4:値の再配置決め

値の再位置決めを実行すること以外は、例 3 の要件と同じです。順次読み込み処理は値 Q から続行されます。

コントロールブロック:

Command Code          L3
Command ID            EX03 (the CID field  may  not  be changed
                      when performing a value repositioning)
File Number           2
ISN                   0  (position to the lowest ISN that contains
                      the value specified in the value buffer)
Format Buffer Length  6 (or larger)
Record Buffer Length  18 (or larger)
Search Buffer Length  7 (or larger)
Value Buffer Length   1 (or larger)
Command Option 1      b (Return option not used)
Command Option 2      A
Additions 1           RBbbbbbb  (the last six positions of this
                      field must  be  set  to  blank  for value
                      repositioning)
Additions 3           Password (file 2 is security protected)

バッファエリア:

Format Buffer         RA,RB.
Search Buffer         RB,1,A.
Value Buffer          Q (repositioning is to be to value Q)

例 5:Value Start オプションまたは再位置決めオプションの使用

順序制御に使用するディスクリプタのインバーテッドリスト

Value               ISN List
  A                   1,4
  B                   2
  D                   3,5

最初の L3/L6 コマンドはコマンドオプション 2=A、または後続の L3/L6 コマンドはコマンドオプション 2=A でアディション 1 の末尾の 6 バイトは空白にリセット(VALUE START 再位置決め)。

ユーザー指定値 ユーザー指定 ISN 読み込み開始(または継続)の ISN
A 0 1
A 1 4
A 2 4
A 4 2
A 5 2
B 0 2
B 1 2
B 2 3
B 3 3
BABC 1 3
C 0 3
D 0 3
D 3 5
D 4 5
D 5 レスポンスコード 3
E–Z レスポンスコード 3

例 6:ASCENDING/DESCENDING オプションの使用例

次の例は、サーチバッファおよびバリューバッファのいろいろな内容に関連した ASCENDING/DESCENDING オプションの使用例を示しています。次の例は、ファイルが読み込まれている場合を示しています。

  • 値 V1 と V2 はともに存在します。それ以外は、GE と LE の例が GT と LT の例と同じになります。

  • ISN=0(開始値と一致する範囲内で位置決めはありません)

graphics/4l3l6_seq_options.png