READ

READ
BROWSE

ALL
(operand1)

[MULTI-FETCH-clause] [RECORDS] [IN] [FILE] view-name  
  [PASSWORD=operand2]
  [CIPHER=operand3]
  [WITH REPOSITION]
  [sequence/range-specification]
  [STARTING WITH ISN=operand4]
  [[IN] SHARED HOLD [MODE=option]]
  [SKIP [RECORDS] IN HOLD]
  [WHERE logical-condition]
   statement
END-READ ストラクチャードモードのみ
LOOP レポーティングモードのみ

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

構文図で使用されている記号については、「構文記号」を参照してください。

関連ステートメント:ACCEPT/REJECT | AT BREAK | AT START OF DATA | AT END OF DATA | BACKOUT TRANSACTION | BEFORE BREAK PROCESSING | GET TRANSACTION DATA | DELETE | END TRANSACTION | FIND | HISTOGRAM | GET | GET SAME | LIMIT | PASSW | PERFORM BREAK PROCESSING | READLOB | RETRY | STORE | UPDATE | UPDATELOB

関連機能グループ:データベースへのアクセスと更新


関数

READ ステートメントは、データベースからレコードを読み取るために使用します。レコードは物理順、Adabas ISN 順、またはディスクリプタ(キー)フィールドの値順で取得できます。この READ ステートメントでは、処理ループを開始します。

プログラミングガイド』の次のセクションも参照してください。

構文説明

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand1 C S           N P I   B *             ×
operand2 C S       A                         ×
operand3 C S           N                     ×
operand4 C S           N P I   B *             ×

* operand1 および operand4 のフォーマット B は、4 以下の長さで使用できます。

構文要素の説明:

構文要素 説明
operand1
読み取るレコード数:

読み取るレコード数は、定数(04294967295)や数値のユーザー定義変数名として、operand1を(キーワード READ の直後にカッコで囲んで)指定することで制限できます。

例:

READ (5) IN EMPLOYEES ...
  
MOVE 10 TO CNT(N2)
READ (CNT) EMPLOYEES  ...

このステートメントでは、指定した制限が、LIMIT ステートメントで設定した制限より優先されます。

プロファイルまたはセッションパラメータ LT で設定された制限のほうが小さい場合、LT 制限が適用されます。

注意:

  1. 4 桁の件数を処理する場合、リーディングゼロを指定します。(0nnnn)。Natural ではカッコで囲まれた 4 桁の数値はステートメントを参照する行番号と解釈されるからです。
  2. operand1 は、READ ループに入るときに評価されます。operand1 の値が READ ループ内で変更されても、読み取られるレコード数には影響しません。
ALL
ALL オプション:

レコードを読み取ることを強調するために、オプションでキーワード ALL を指定できます。

operand1ALL が省略された場合、ALL オプションがデフォルトで使用されます。

MULTI-FETCH-clause
MULTI-FETCH 節:

以下の「MULTI-FETCH 節」を参照してください。

view-name
ビュー名:

view-name としてビューの名前を指定します。この名前は、DEFINE DATA ステートメント内、あるいはプログラム外のグローバルデータエリアまたはローカルデータエリアに事前に定義しておく必要があります。

レポーティングモードでは、DEFINE DATA LOCAL ステートメントが使用されていない場合、DDM の名前は view-name です。

PASSWORD=operand2

CIPHER=operand3

PASSWORD および CIPHER 節:

これらの節は Adabas データベースにのみ適用可能です。Entire System Server では使用できません。

PASSWORD 節は、パスワード保護されているファイルからデータを取得するときのパスワードの指定に使用します。

CIPHER 節は、暗号化されているファイルからデータを取得するときのサイファキーの指定に使用します。

詳細については、ステートメント FIND および PASSW を参照してください。

WITH REPOSITION
WITH REPOSITION オプション:

このオプションは、READ ステートメントを再位置決めイベントに反応するように設定するために使用します。「WITH REPOSITION オプション」を参照してください。

sequence/range-specification
順序/範囲の指定:

このオプションでは、取得順序/範囲を指定します。「順序/範囲の指定」を参照してください。

STARTING WITH ISN=operand4
STARTING WITH ISN 節:

この節は Adabas データベースにのみ適用されます。

Adabas へのアクセス

この節は、物理順または論理順(昇順/降順)の READ ステートメントと組み合わせて使用します。指定された値(operand4)は Adabas ISN(内部シーケンス番号)を表し、READ ループを開始するレコードを明確に指定するために使用します。

  • 論理順
    等号(=)で記述されても、READ ステートメントは対応するディスクリプタフィールドに同じ開始値を持つレコードのみを返すわけではなく、指定された開始値で始めて昇順または降順に論理的な参照を開始します。いくつかのレコードがディスクリプタフィールドに同じ内容を持っている場合、それらは ISN ソート順に返されます。

    STARTING WITH ISN 節は、開始値が最初のレコードのディスクリプタ値と一致している場合にのみ適用される一種の "第 2 レベル" の選択条件になります。開始値と同じディスクリプタ値の全レコードおよび開始 ISN "以下"(降順 READ については "以上")の ISN は Adabas で無視されます。READ ループで返される最初のレコードは次のいずれかです。

    • ディスクリプタ = 開始値の最初のレコードおよび開始 ISN より "高い"(降順 READ については "低い")ISN。

    • このようなレコードが存在しない場合は、開始値より "大きい"(降順 READ については "小さい")ディスクリプタを持つ最初のレコード。

  • 物理順
    レコードは、それらが物理的に保存されている順序で返されます。STARTING WITH ISN 節を指定した場合、開始 ISN と同じ ISN のレコードに達するまで、Adabas では全レコードが無視されます。返される最初のレコードは、ISN = 開始 ISN のレコードに続く次のレコードです。

この節は、処理を継続する次のレコードを簡単に指定するために、処理が中断された READ ループ内での再位置決めに使用できます。これは特に、次のレコードをディスクリプタ値で一意に識別できない場合に役立ちます。また、分散クライアント/サーバーアプリケーションで、レコードをサーバープログラムで読み取ってクライアントプログラムで処理し、レコードを順次処理ではなくバッチ処理する場合にも役立ちます。

例については、下記のプログラム REASISND を参照してください。

[[IN] SHARED HOLD [MODE=option]]
SHARED HOLD 節:

注意:
この節は Adabas へのアクセスのみに使用できます。

この節は"共有ホールド"状態で読み取られるレコードの配置に使用できます。レコードは、多数のユーザーが同時に共有ホールドにできます。レコードが共有ホールド状態にある限り、同時ユーザーによって排他的ホールドに設定できないため、更新から保護されます。このため、処理中はユーザーがレコードを更新できないので、レコードデータのデータ整合性が確保されます。

特に、異なる MU/PE オカレンス(GET SAMEステートメント)を読み取るために同じレコードを複数のステートメントで取得したり、区分的手法(READLOB ステートメント)で LOB フィールドを参照したりする場合は、共有ホールドステートにより、他のユーザーのレコードをブロックすることなく、このトランザクションでのデータの安定性を保証できます。

このようなホールド状態は読み込み順序を保護する効果的な手段ですが、レコードをこの"ソフトロック"からいつ解放するかという基本的で重要な問題が生じます。この問題は個々のアプリケーションの局面によって異なるので、MODE 副節で異なるオプションを選択できます。

MODE オプション
ホールド期間
説明
C レコードの読み込み時のみ。 読み込まれるレコードのバージョンのみが、レコードを最後に更新したユーザーによってコミットされるようにします。このオプションは実際にホールド状態でロックを設定するのではなく、読み込み時に別のユーザーによってレコードが排他的にホールドされないようにチェックするだけです。
Q 次の順序のレコードが読み込まれるまで。 次の場合に、レコードを共有ホールドから解放します。
S 論理トランザクションが終了するまで。 END TRANSACTION または BACKOUT TRANSACTION ステートメントで論理トランザクションが終了すると、レコードが共有ホールドから解放されます。
MODE=Q および MODE=S では、読み取り中のレコードが再度ホールドからリリースされるまで、他のユーザーが同時に更新できないようにします。

MODE 副節が指定されていない場合、デフォルトは MODE=C です。

例 8 - SHARED HOLD 節」も参照してください。

SKIP RECORDS IN HOLD
SKIP RECORDS 節

注意:
この節は Adabas へのアクセスのみに使用できます。

ホールド状態のレコードを読み込むとき、このレコードが別のユーザーによって同時にホールドされていると、Natural エラー NAT3145(Adabas レスポンスコード 145)が発生する場合があります。共有ホールドが要求され、レコードが排他的ホールドの状態にある場合、または排他的ホールドが要求され、レコードが排他的または共有ホールドの状態にある場合に発生します。

エラー NAT3145 は "クリーンデータ処理"を保証するための適切な対処ですが、ホールドされているレコードをスキップできると便利です。このようなレコードを処理せずにループ処理を続行しても問題がない場合は、SKIP RECORDS 節を使用します。

SKIP RECORDS 節を適用すると、Natural はまずホールドされているレコードを読み込もうとします。

レコードがすでにホールドされていて、Natural エラー NAT3145 が発生する場合、以下の原因が考えられます。

  • エラー処理が開始されていない

  • レコード(別のユーザーによって現在ホールドされている)がホールドなしで即座に再フェッチされるが、プログラムロジックの面では処理されない

  • スキップされたレコードの次のレコードはホールド状態で読み込まれ、処理が続行する

例 9 - SKIP RECORDS 節」も参照してください。

WHERE logical-condition
WHERE 節:

WHERE 節は、追加の選択条件(logical-condition)を指定するために使用できます。この条件は、値が読み取られた、値に対する処理が実行されるに評価されます(AT BREAK 評価を含む)。

logical-condition の構文については、『プログラミングガイド』の「論理条件基準」で説明しています。

WHERE 節を含む READ ステートメントに LIMIT ステートメントや処理回数の制限を指定した場合、WHERE 節で排除されたレコードは制限数にカウントされません。

END-READ
End of READ ステートメント:

ストラクチャードモードの場合、Natural の予約キーワード END-READ を使用して READ ステートメントを終了させる必要があります。

レポーティングモードでは、Natural のステートメント LOOP を使用して READ ステートメントを終了します。

LOOP

MULTI-FETCH 節

注意:
この節は、Adabas データベースでのみ使用できます。

MULTI-FETCH

ON
OFF
[OF] multi-fetch-factor

注意:
[MULTI-FETCH OF multi-fetch-factor] は、データベースタイプ ADA および ADA2 に対して評価されません。デフォルト処理モードが適用されます(プロファイルパラメータ MFSET を参照)。MULTI-FETCH 節は、データベースタイプ ADA2, で使用しても完全に無視されます(『コンフィグレーションユーティリティ』ドキュメントの「データベース管理システムの割り当て」を参照)。

詳細については、『プログラミングガイド』の「MULTI-FETCH 節」(Adabas)

WITH REPOSITION オプション

注意:
このオプションは、基準データベースが Adabas の場合にのみ適用されます。

WITH REPOSITION オプションでは、READ ステートメントを再位置決めイベントに反応するように設定できます。これにより、アクティブな READ ループ内で別の開始値に再位置決めを行うことができます。READ ステートメントの処理は新しい開始値で継続します。

READ ステートメントを WITH REPOSITION オプション付きで使用すると、再位置決めイベントが 2 つの方法のいずれかで起動されます。

  1. ESCAPE TOP REPOSITION ステートメントが実行され、ESCAPE TOP REPOSITION ステートメントの実行時、Natural はループ開始への即時分岐を行い、再スタートを実行します。つまり、データベースは、検索値変数の現在の内容に従って、ファイルの新しいレコードに再位置決めを行います。同時に、ループカウンタ *COUNTER をゼロにリセットします。

  2. READ ループがデータベースから次のレコードを取り出そうとして、システム変数 *COUNTER の値が 0 であるとき。

    注意:
    *COUNTER が、アクティブな READ ループ内で 0 に設定されている場合、現在のレコードの処理は続行されます。ループ開始への即時分岐は実行されません。Natural for Windows、Natural for UNIX、および Natural for OpenVMS では、この方法で再位置決めイベントを起動することはできません。この機能は、Natural for Mainframes バージョンの以前のバージョンとの互換性のためにのみ保持されています。したがって、このプロセスを使用することはお勧めしません。

機能上の考慮事項

  • READ ステートメントにループ制限(READ (10) EMPLOYEES WITH REPOSITION ..)があり、再スタートイベントが起動された場合、再位置決めが発生するまでにすでに処理されたレコード件数にかかわらず、ループは別の新しい 10 レコードを取得します。

  • ESCAPE TOP REPOSITION ステートメントが実行される場合、ただし、(WITH REPOSITION キーワードが READ ステートメントに設定されていないか、事後ループステートメントが READ 以外であるために)最も内側のループが再位置決めできないときは、対応するランタイムエラーが発行されます。

  • ESCAPE TOP ステートメントは参照を許可しないので、最も内側の処理ループが READ ..WITH REPOSITION ステートメントであれば、再位置決めイベントの開始だけができます。

  • 再位置決めイベントは AT START OF DATA セクションの実行を起動せず、ループ制限オペランド(変数の場合)の再評価も起動しません。

  • 検索値が変更されなかった場合、ループは最初のループ開始のように同じレコードに再位置決めします。

順序/範囲の指定

取得順序/範囲の指定には、3 つの構文オプションを使用できます。

構文オプション 1:

[IN] [PHYSICAL]

ASCENDING
DESCENDING
VARIABLE operand5
DYNAMIC operand5

[SEQUENCE]

構文オプション 2:

 

 

=
EQ
EQUAL TO
[STARTINGFROM

 

               

BY
WITH

ISN operand6

THRU
ENDING AT

operand7

                     

構文オプション 3:

[IN] [LOGICAL]    

ASCENDING
DESCENDING
VARIABLE operand5
DYNAMIC  operand5

[SEQUENCE]    

BY
WITH

descriptor    
 

=
EQ
EQUAL TO
[STARTINGFROM

operand6

THRU
ENDING AT

operand7

   

=
EQ
EQUAL TO
[STARTINGFROM

operand6 TO operand7  
   

<
LT
LESS THAN
>
GT
GREATER THAN
<=
LE
LESS EQUAL
>=
GE
GREATER EQUAL

operand6              

注意:

  1. Entire System Server で、構文オプション [2] と [3] は使用できません。
  2. 図 3 の比較演算子を使用した場合は、オプション ENDING ATTHRUTO は使用できません。これらの比較演算子は HISTOGRAM ステートメントにも有効です。

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand5   S       A                         ×
operand6 C S       A   N P I F B * D T L       ×
operand7 C S       A   N P I F B * D T L       ×

* operand6 および operand7 のフォーマット B は、4 以下の長さでのみ使用できます。

構文要素の説明:

構文要素 説明
READ IN PHYSICAL SEQUENCE
Read in Physical Sequence:

このオプションは、データベースに物理的に保存されている順にレコードを読み取る場合に使用します。

PHYSICAL はデフォルトの順序です。

READ BY ISN
Read by ISN:

このオプションは、レコードを Adabas ISN(内部シーケンス番号)順に読み取るときに使用します。(キーワード BY を使用する代わりに、キーワード WITH を指定できます。このキーワードには、同じ効果があります)。

READ BY ISN は、Adabas データベースに対してのみ使用できます。

注意:
XML データベースの場合:READ BY ISN は Tamino オブジェクト ID の順に従って XML オブジェクトを読み取るために使用します。

READ IN LOGICAL SEQUENCE
Read in Logical Sequence:

このオプションは、レコードをディスクリプタ(キー)フィールドの値の順に読み取るために使用します。

ディスクリプタが指定されると、レコードはそのディスクプタの値の順序で読み取られます。順序制御には、ディスクリプタ、サブディスクリプタ、スーパーディスクリプタ、またはハイパーディスクリプタを使用できます。フォネティックディスクリプタ、ピリオディックグループ内のディスクリプタ、またはピリオディックグループフィールドを含むスーパーディスクリプタは使用できません。

ディスクリプタを指定しなかった場合、DDM に指定されたデフォルトのディスクリプタ(Default Sequence フィールド)が使用されます。

順序制御に使用するディスクリプタが空値省略で定義されている場合(Adabas のみ)、ディスクリプタ値が空値であるレコードは読み取られません。

順序制御に使用するディスクリプタがマルチプルバリューフィールドの場合(Adabas のみ)、存在する値の個数に応じて同じレコードが何回も読み取られます。

注意:
READ IN LOGICAL SEQUENCE については、『プログラミングガイド』でも説明されています。「データベースアクセスのためのステートメント」の「READ ステートメント」を参照してください。

ASCENDING | DESCENDING | VARIABLE | DYNAMIC SEQUENCE
昇順/降順:

この節は、Adabas、XML データベース、および SQL データベースにのみ適用されます。READ PHYSICAL ステートメントでは、DB2 データベースにのみ適用できます。

この節を使用して、レコードを昇順または降順のどちらで読み取るかを指定できます。

  • デフォルトは昇順です。昇順はキーワード ASCENDING を使用して明示的に指定することもできます。

  • レコードを降順で読み取る場合は、キーワード DESCENDING を指定します。

  • レコードを昇順または降順のどちらで読み取るかを事前に決めずに実行時に決めるには、変数(operand5)の前に VARIABLE キーワードまたは DYNAMIC キーワードを指定します。operand5 は、フォーマット/長さ A1 で、値 A("昇順")または D("降順")が含まれている必要があります。

    • キーワード VARIABLE を使用した場合、読み取り順(operand5 の値)は、READ 処理ループの開始時に評価され、READ ループ内で operand5 フィールドが変更されるかどうかに関係なく、ループが終了するまで変わりません。

    • キーワード DYNAMIC が指定された場合、READ 処理ループ内でレコードを取得する前に読み込み順(operand5 の値)が評価されます。あるレコードからレコードまで読み込み順を変更することが可能です。これは、READ ループの任意の場所で昇順から降順(または、逆)へのスクロール順の変更を可能にします。

注意:
XML データベースの場合:DYNAMIC SEQUENCE は使用できません。

STARTING FROM ... ENDING AT/TO
STARTING FROM/ENDING AT 節

STARTING FROM および ENDING AT 節は、ユーザー指定の値の範囲を基準にしてレコードの集合の読み取りを制限するために使用します。

STARTING FROM 節(=EQEQUAL TO、または [STARTING] FROM)は、読み取り操作の開始値を決めます。開始値を指定すると、指定した値から読み取りが始まります。ファイルに開始値が存在しない場合、次に高い(または DESCENDING 読み取りでは低い)値が使用されます。より高い(または DESCENDING ではより低い)値が存在しなければ、ループに入りません。

レコードを終了値に制限するには、包括的な範囲を示す用語 THRUENDING AT、または TO を持つ ENDING AT 節を指定できます。読み取りディスクリプタフィールドが終了値を超えると、自動的なループ終了が実行されます。TOTHRUENDING AT キーワードの基本機能は、非常によく似ていますが、内部的に動作が異なります。

THRU/ENDING AT
THRU/ENDING AT オプション:

THRU または ENDING AT を使用した場合、開始値だけがデータベースに供給され、データベースによってレコードが返された後に、Natural ランタイムシステムによって終了値のチェックが実行されます。読み取り順が ASCENDING の場合、開始値は READ ループで最初に返される値(およびレコード)を表すため、開始値としてより低い値を供給し、終了値としてより高い値を供給する必要があります。ただし、逆順読み取り(DESCENDING)を呼び出す場合、より高い値は開始値に、そして終了値にはより低い値が出現する必要があります。

内部的に、読み取る範囲の終了を決定するために、Natural は終了値を超えるレコードを 1 件読み取ります。終了値に到達したために READ ループを終了したとき、この最後のレコードは実際には要求した範囲内の最後のレコードではなく、その範囲を超えた最初のレコードである(最後の結果レコードを超えるレコードがファイルに含まれない場合を除く)ことに注意してください。

THRU および ENDING AT 節は、READ または HISTOGRAM ステートメントをサポートするすべてのデータベースに対して使用することができます。

TO
TO オプション:

キーワード TO を使用すると、開始値と終了値の両方がデータベースに送られ、Natural は値の範囲をチェックしません。終了値を超えると、データベースは"ファイルの終わり"に到達した場合と同様に対処し、データベースループを終了します。データベースにより完全な範囲チェックが行われるので、ASCENDING または DESCENDING のいずれの順序でブラウズしていても、常に範囲の小さい方の値が開始値になり、大きい方の値が終了値になります。

THRU/ENDING AT と TO の機能上の違いに関する注意

次のリストは、THRU/ENDING AT および TO オプションの機能上の違いを示しています。

THRU/ENDING AT TO
終了値に達したために READ ループが終了するとき、ビューには "範囲外" の最初のレコードが含まれます。 終了値に達したために READ ループが終了するとき、ビューには指定した範囲の最後のレコードが含まれます。
終了値変数が READ ループ中に修正された場合、次のレコードの読み取り時に新しい値が終了値チェックに使用されます。 終了値変数は READ ループ開始時にのみ評価されます。READ ループ中の以降の修正はすべて無効です。
範囲が不正な場合(例えば、READ .. = 'B' THRU 'A')、レコードが返されないだけで、データベースエラーは発生しません。 値範囲を降順で供給してはならないため、不正な範囲はデータベースエラー(例:RC=61)となります。
READ .. DESCENDING が、開始値および終了値と一緒に使用される場合、開始値はファイルでの位置決めに使用され、終了値は Natural で "範囲終了" をチェックするために使用されます。したがって、開始値は終了値以上の値です。 両方の値がデータベースに渡されるため、それらは昇順で出現する必要があります。つまり、昇順または降順で読み取っているかどうかに関係なく、開始値は終了値以下の値です。
範囲のオーバーフローをチェックするために、ディスクリプタ値は基準データベースビューに出現する必要があります。つまり、それはレコードバッファに返される必要があります。 ディスクリプタは、返されるレコードフィールドに必要ではありません。
Adabas マルチバリューフィールド(MU フィールド)またはサブ/スーパー/ハイパーディスクリプタに対して終了値チェックはできません。また、プログラムコンパイル時に構文エラー NAT0160 を引き起こします。 MU フィールドおよびサブ/スーパー/ハイパーディスクリプタに対して終了値を指定できます。
すべてのデータベースに使用できます。 すべてのデータベースに使用できます。

注意:
READ/HISTOGRAMTHRU/ENDING AT の結果は、Natural とアクセスされたデータベースが別のプラットフォーム上にあり、照合順序が異なる場合、READ/HISTOGRAMTO の結果とは異なる可能性があります。

READ で使用可能なシステム変数

Natural システム変数 *ISN および *COUNTERREAD ステートメントで使用可能です。

これらのシステム変数は、P10 のフォーマットと長さで定義されています。このフォーマット/長さは変更できません。

システム変数の使用方法について次に説明します。

システム変数 説明
*ISN

システム変数 *ISN には、現在処理中のレコードの Adabas ISN が入ります。

*COUNTER システム変数 *COUNTER には、入力した処理ループの回数が含まれます。

例 1 - READ ステートメント

** Example 'REAEX1S': READ (structured mode)                            
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 PERSONNEL-ID                                                        
  2 NAME                                                                
1 VEHIC-VIEW VIEW OF VEHICLES                                           
  2 PERSONNEL-ID                                                        
  2 MAKE                                                                
END-DEFINE                                                              
*                                                                       
LIMIT 3                                                                 
*                                                                       
WRITE 'READ IN PHYSICAL SEQUENCE'                                       
READ EMPLOY-VIEW IN PHYSICAL SEQUENCE                         
  DISPLAY NOTITLE PERSONNEL-ID NAME *ISN *COUNTER                       
END-READ                                                            
*                                                                       
WRITE / 'READ IN ISN SEQUENCE'                                          
READ EMPLOY-VIEW BY ISN STARTING FROM 1 ENDING AT 3
  DISPLAY         PERSONNEL-ID NAME *ISN *COUNTER  
END-READ                                       
*                                                  
WRITE / 'READ IN NAME SEQUENCE'                    
READ EMPLOY-VIEW BY NAME                     
  DISPLAY         PERSONNEL-ID NAME *ISN *COUNTER  
END-READ                                   
*                                                  
WRITE / 'READ IN NAME SEQUENCE STARTING FROM ''M'''
READ EMPLOY-VIEW BY NAME STARTING FROM 'M'   
  DISPLAY         PERSONNEL-ID NAME *ISN *COUNTER  
END-READ                                      
*                                                  
END

プログラム REAEX1S の出力:

PERSONNEL         NAME            ISN         CNT     
   ID                                                 
--------- -------------------- ----------- -----------
                                                      
READ IN PHYSICAL SEQUENCE                             
50005800  ADAM                           1           1
50005600  MORENO                         2           2
50005500  BLOND                          3           3
                                                      
READ IN ISN SEQUENCE                                  
50005800  ADAM                           1           1
50005600  MORENO                         2           2
50005500  BLOND                          3           3
                                                      
READ IN NAME SEQUENCE                                 
60008339  ABELLAN                      478           1
30000231  ACHIESON                     878           2
50005800  ADAM                           1           3
                                                      
READ IN NAME SEQUENCE STARTING FROM 'M'               
30008125  MACDONALD                    923           1
20028700  MACKARNESS                   765           2
40000045  MADSEN                       508           3

レポーティングモードの例については、次のプログラムを参照してください:REAEX1R

例 2 - READ WITH REPOSITION

DEFINE DATA LOCAL
1 MYVIEW VIEW OF ...
  2 NAME
1 #STARTVAL (A20) INIT <'A'>
1 #ATTR     (C)
END-DEFINE
...
SET KEY PF3
...
READ MYVIEW WITH REPOSITION BY NAME = #STARTVAL
INPUT (IP=OFF AD=O) 'NAME:' NAME /
    'Enter new start value for repositioning:' #STARTVAL (AD=MT CV=#ATTR) /
    'Press PF3 to stop'
  IF *PF-KEY = 'PF3'
    THEN STOP
  END-IF
  IF #ATTR MODIFIED
    THEN ESCAPE TOP REPOSITION
  END-IF
END-READ
...
DEFINE DATA LOCAL
1 MYVIEW VIEW OF ...
  2 NAME
1 #STARTVAL (A20) INIT <'A'>
1 #ATTR     (C)
END-DEFINE
...
SET KEY PF3
...
READ MYVIEW WITH REPOSITION BY NAME = #STARTVAL
  INPUT (IP=OFF AD=O) 'NAME:' NAME /
    'Enter new start value for repositioning:' #STARTVAL (AD=MT CV=#ATTR) /
    'Press PF3 to stop'
  IF *PF-KEY = 'PF3'
    THEN STOP
  END-IF
  IF #ATTR MODIFIED
    THEN RESET *COUNTER
  END-IF
END-READ
...

例 3 - READ および FIND ステートメントの結合

次の例では、まず EMPLOYEES ファイルから、ディスクリプタ NAME の値で論理順にレコードを読み取ります。次に、EMPLOYEES ファイルの人事番号を検索条件として、VEHICLES ファイルを FIND ステートメントで検索します。結果のレポートには、読み取られた従業員の名前(EMPLOYEES ファイルから読み取られる)と、この従業員が所有する自動車のモデル(VEHICLES ファイルから読み取られる)が示されます。1 人で何台も自動車を所有している場合、同一名で複数行が出力されます。

** Example 'REAEX2': READ and FIND combination                          
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 PERSONNEL-ID                                                        
  2 FIRST-NAME                                                          
  2 NAME                                                                
  2 CITY                                                                
1 VEH-VIEW VIEW OF VEHICLES                                             
  2 PERSONNEL-ID                                                        
  2 MAKE                                                                
END-DEFINE                                                              
*                                                                       
LIMIT 10                                                                
*                                                                       
RD. READ EMPLOY-VIEW BY NAME STARTING FROM 'JONES'                    
  SUSPEND IDENTICAL SUPPRESS                                            
  FD. FIND VEH-VIEW WITH PERSONNEL-ID = PERSONNEL-ID (RD.)       
    IF NO RECORDS FOUND                                                 
      ENTER                                   
    END-NOREC                                 
    DISPLAY NOTITLE (ES=OFF IS=ON ZP=ON AL=15)
            PERSONNEL-ID (RD.)                
            FIRST-NAME (RD.)                  
            MAKE (FD.) (IS=OFF)               
  
  END-FIND
END-READ                          
END

プログラム REAEX2 の出力:

PERSONNEL      FIRST-NAME         MAKE      
      ID                                       
--------------- --------------- ---------------
                                               
20007500        VIRGINIA        CHRYSLER       
20008400        MARSHA          CHRYSLER       
                                CHRYSLER       
20021100        ROBERT          GENERAL MOTORS 
20000800        LILLY           FORD           
                                MG             
20001100        EDWARD          GENERAL MOTORS 
20002000        MARTHA          GENERAL MOTORS 
20003400        LAUREL          GENERAL MOTORS 
30034045        KEVIN           DATSUN         
30034233        GREGORY         FORD           
11400319        MANFRED

例 4 - DESCENDING オプション

** Example 'READSCND': READ (with DESCENDING SEQUENCE)                  
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPL VIEW OF EMPLOYEES                                                
  2 NAME                                                                
  2 FIRST-NAME                                                          
  2 BIRTH                                                               
END-DEFINE                                                              
*                                                                       
READ (10) EMPL IN DESCENDING SEQUENCE BY NAME FROM 'ZZZ'          
  DISPLAY *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD)                    
END-READ                                                           
END

例 5 - VARIABLE オプション

** Example 'REAVSEQ':  READ  (with VARIABLE SEQUENCE)                   
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPL VIEW OF EMPLOYEES                                                
  2 NAME                                                                
  2 FIRST-NAME                                                          
  2 BIRTH                                                               
*                                                                       
1 #DIR        (A1)                                                      
1 #STARTVALUE (A20)                                                     
END-DEFINE                                                              
*                                                                       
SET KEY PF7 PF8                                                         
*                                                                       
INPUT 'Select READ direction'                                           
   // 'Press' 08T 'PF7' (I)                  21T 'to read backward'     
    /         08T 'PF8' (I) 'or' 'ENTER' (I) 21T 'to read forward'      
*                                                                       
IF *PF-KEY = 'PF7'                                                      
  MOVE 'D'   TO #DIR                                
  MOVE 'ZZZ' TO #STARTVALUE                         
ELSE                                                
  MOVE 'A' TO #DIR                                  
  MOVE 'A' TO #STARTVALUE                           
END-IF                                              
*                                                   
READ (10) EMPL IN VARIABLE #DIR SEQUENCE
               BY NAME FROM #STARTVALUE
  DISPLAY *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD)
END-READ                                      
END

例 6 - DYNAMIC オプション

DEFINE DATA LOCAL
1 #DIRECTION (A1) INIT <'A'>   /* 'A' = ASCENDING
1 #EMPVIEW VIEW OF EMPLOYEES
2 NAME
...
END-DEFINE
...
READ #EMPVIEW IN DYNAMIC #DIRECTION SEQUENCE BY NAME = 'SMITH'
   INPUT (AD=O) NAME
       / 'Press PF7 to scroll in DESCENDING sequence'
       / 'Press PF8 to scroll in ASCENDING  sequence'
   ..
   IF *PF-KEY = 'PF7' THEN MOVE 'D' TO #DIRECTION END-IF
   IF *PF-KEY = 'PF8' THEN MOVE 'A' TO #DIRECTION END-IF
END-READ
...

例 7 - STARTING WITH ISN 節

** Example 'REASISND': READ  (with STARTING WITH ISN)                   
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPL VIEW OF EMPLOYEES                                                
  2 NAME                                                                
  2 FIRST-NAME                                                          
  2 BIRTH                                                               
*                                                                       
1 #DIR      (A1)                                                        
1 #STARTVAL (A20)                                                       
1 #STARTISN (N8)                                                        
END-DEFINE                                                              
*                                                                       
SET KEY PF3 PF7 PF8                                                     
*                                                                       
MOVE 'ADKINSON' TO #STARTVAL                                            
*                                                                       
READ (9) EMPL BY NAME = #STARTVAL                                  
  WRITE *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD) *COUNTER             
  IF *COUNTER = 5 THEN                                      
    MOVE NAME TO #STARTVAL                                  
    MOVE *ISN TO #STARTISN                                  
  END-IF                                                    
END-READ                                                  
*                                                           
#DIR := 'A'                                                 
*                                                           
REPEAT                                                      
 READ EMPL IN VARIABLE #DIR  BY NAME = #STARTVAL           
            STARTING WITH ISN = #STARTISN            
    MOVE NAME TO #STARTVAL                                  
    MOVE *ISN TO #STARTISN                                  
    INPUT NO ERASE  (IP=OFF AD=O)                           
         15/01 *ISN  NAME  FIRST-NAME  BIRTH (EM=YYYY-MM-DD)
           //  'Direction:' #DIR                            
           //  'Press PF3 to stop'                          
           /   '      PF7 to go step back'                  
           /   '      PF8 to go step forward'               
           /   '      ENTER to continue in that direction'
    /*                                                    
    IF *PF-KEY = 'PF7' AND #DIR = 'A'                     
      MOVE 'D' TO #DIR                                    
      ESCAPE BOTTOM                                       
    END-IF                                                
    IF *PF-KEY = 'PF8' AND #DIR = 'D'                     
      MOVE 'A' TO #DIR                                    
      ESCAPE BOTTOM                                       
    END-IF                                                
    IF *PF-KEY = 'PF3'                                    
      STOP                                                
    END-IF                                                
  END-READ                                          
  /*                                                      
  IF *COUNTER(0290) = 0                                   
    STOP                                                  
  END-IF                                                  
END-REPEAT                                                
END

例 8 - SHARED HOLD 節

READ EMPL-VIEW WITH NAME = ...         
     IN SHARED HOLD MODE=Q  /* Record in shared hold until next record is read.
   ...  
   GET EMPL-VIEW  *ISN      /* The record remains unchanged!
   ...                                        
END-READ

例9 - SKIP RECORDS 節

READ EMPL-VIEW WITH NAME = ...  /* Records found are put in hold while reading.
     SKIP RECORDS IN HOLD       /* Records already held by other users are skipped
  ...                           /* to prevent error NAT3145.
  UPDATE
  END TRANSACTION
END-READ