順次アクセスの場合、READ ステートメントはファイル内の次の論理レコードをオ ブジェクト・プログラムが使用できるようにします。ランダム・アクセスの場合には、READ ステートメントは、 オブジェクト・プログラムが直接アクセス・ファイル内の指定したレコードを使用可能にします。
READ ステートメントを実行するときには、関連するファイルを INPUT モードま たは I-O モードでオープンしておく必要があります。
フォーマット 1: 順次検索の READ ステートメント >>-READ--ファイル名-1---+------+--+--------+--+------------+-----> '-NEXT-' '-RECORD-' '-INTO--ID-1-' >--+-----------------------------------+------------------------> '-+----+--END----命令ステートメント-1--' '-AT-' >--+----------------------------------------+--+----------+---->< '-NOT--+----+--END----命令ステートメント-2-' '-END-READ-' '-AT-'
フォーマット 2: ランダム検索の READ ステートメント >>-READ--ファイル名-1--+--------+--+------------+---------------> '-RECORD-' '-INTO--ID-1-' >--+-------------------------+----------------------------------> '-KEY--+----+--データ名-1--' '-IS-' >--+----------------------------------------+-------------------> '-INVALID--+-----+---命令ステートメント-3--' '-KEY-' >--+--------------------------------------------+---------------> '-NOT INVALID--+-----+---命令ステートメント-4--' '-KEY-' >--+----------+------------------------------------------------>< '-END-READ-'
動的アクセス・モードのファイルの場合に、レコードを順次検索するためには NEXT RECORD 句を指定する 必要があります。
ID-1 ID-1 は、選択された送り出しレコード記述項目に対して、MOVE ステートメントの規則に従う有効な受け取りフィールドでなければなりません。
ファイル名-1 に関連付けられたレコード域と ID-1 は、 同じストレージ域を占めることはできません。
ファイル名-1 に関連付けられたレコード記述が 1 つだけしかない場合、または ID-1 によって 参照されるすべてのレコードとデータ項目に基本英数字項目または英数字グループ項目が記述されている場合、 INTO 句を指定した READ ステートメントの実行結果は、 指定された順序で以下の規則を適用するのと同じことになります。
ID-1 が日付フィールドである場合は、日付フィールドが関係する移動で説明された動作に従って、 暗黙の MOVE ステートメントが実行されます。
ファイル名-1 に関連付けられたレコード記述が複数あり、それらのすべてに英数字グループ項目または基本英数字項目が記述されていない場合は、以下の規則が適用されます。
KEY IS 句は、索引ファイルに対してのみ指定できます。データ名-1 は、ファイル名-1 に関連付けられたレコード・キーと一致しなければなりません。データ名-1 を修飾することができます。添え字付けはできません。
順次アクセスの場合、AT END 句および利用可能な EXCEPTION/ERROR プロシージャーは、両方とも省略できます。
AT END 条件の処理に関する詳細は、AT END 条件を参照してください。
INVALID KEY 句および利用可能な EXCEPTION/ERROR プロシージャーは、両方とも省略することができます。
INVALID KEY 句の処理に関する情報は、無効キー条件を参照してください。
この明示的範囲終了符号は、READ ステートメントの範囲を区切るために使用されます。 END-READ 句を使用することによって、 条件的な READ ステートメントを他の条件ステートメント内にネストすることができます。 END-READ 句は、READ 命令ステートメントと共に使用することもできます。 詳細については、範囲区切りステートメントを参照してください。
ファイル名-1 に関連付けられた複数のレコード記述項目がある場合、それらのレコ ードは自動的に同じストレージ域を共用します。つまり、それらは暗黙に再定義さ れます。READ ステートメントが実行された後、 現行レコードの範囲内にあるこれらのデータ項目のみが置換されます。 この範囲を超えて格納されているデータ項目は定義されていません。 以下の図では、この概念を説明しています。現在のレコードの範囲が、ファイル名-1 のレコード記述項目を超えている場合には、そのレコードは最大サイズまで右側が切り捨てられます。上記のどちらの場合も、READ ステートメントは正しく実行され、 入出力状況として 04 が設定されてレコード長に不一致があったことを示します。

順次アクセス・モードの全ファイルについてフォーマット 1 を使用しなければなり ません。
フォーマット 1 の READ ステートメントを実行すると、ファイルから次の論理レコードが取り出されます。アクセスされる次のレコードは、ファイル編成によって決定されます。
NEXT RECORD とは、レコードの論理的なシーケンスの中で次の位置にあるレコー ドのことです。NEXT 句を指定する必要はありません。 READ ステートメントの実行には影響がありません。
このファイルのファイル制御項目の中に SELECT OPTIONAL が指定してあり、 オブジェクト・プログラムのこの実行中にファイルが使用可能でない場合には、 最初の READ ステートメントの実行で AT END 条件が生じます。ただし、 ファイルが使用可能でないので、システム定義のファイル終了処理は実行されません。
ファイル位置標識が、次の論理レコードが存在しないということ、 またはオプショナル入力ファイルが使用可能でないということを示している場合、 次のことが、以下に述べられている順に起こります。
AT END 句および利用可能な EXCEPTION/ERROR プロシージャーは、両方とも省略できます。
AT END 条件が起こると、READ ステートメントの実行は正しく行われません。関連付けられたレコード域の内容は未定義のままであり、 ファイル位置標識は有効な次のレコードが設定されていないことを示すように設定されます。
QSAM ファイルの場合、読み取りの失敗の後、データにアクセスしたり、データをレコード域へ移動しようとすると、記憶保護例外という結果になる可能性があります。
READ ステートメントの実行中に AT END 条件が起こらなければ、 AT END 句は指定されていても無視され、以下の処置が行われます。
USE AFTER STANDARD EXCEPTION プロシージャーが指定されていなければ、 制御は READ ステートメントの終わりか、または命令ステートメント-2 が指定されていればそのステートメントに移されます。
READ ステートメントの実行が失敗した後では、 関連するレコード域の内容は未定義であり、ファイル位置標識は、 有効な次のレコードが設定されていないことを示すように設定されます。読み取りの失敗の後、データにアクセスしたり、デー タをレコード域へ移動しようとすると、記憶保護例外という結果になる可能性があ ります。
READ ステートメントの実行時、ボリュームの終わりが認識されても、論理的なフ ァイルの終わりに到達していない場合は、以下の処置が実行されます。
NEXT RECORD とは、キー・シーケンスで次に続く論理レコードです。
索引付きファイルでは、キー・シーケンスは、現行参照キーの昇順となる値のシーケンスです。 相対ファイルでは、キー・シーケンスは、 ファイル内に存在するレコードが持つ相対レコード番号の昇順となる値のシーケンスです。
READ ステートメントを実行する場合は、OPEN、START、または READ ステート メントを正常に実行して、ファイル位置標識を事前に設定しておく必要がありま す。 READ ステートメントが実行されると、 ファイル位置標識で示されるレコードがそのファイル位置標識によって示されるパスを通してアクセス可能であるならば、 そのレコードが使用可能にされます。
レコードがすでにアクセス可能でなくなっている場合(例えば削除されてしまった ために)、ファイル位置標識はファイル内の次の既存レコードを指し示すように更新 され、そのレコードが使用可能にされます。
順次アクセス・モードのファイルの場合は、NEXT 句を指定する必要はありません。
動的アクセス・モードのファイルの場合、レコードを順次検索するためには、NEXT 句を指定しなければなりません。
ランダム・アクセス・モードの索引付きファイルおよび相対ファイルに対しては、 フォーマット 2 を指定する必要があります。また、レコードの取り出しがランダム であるときの動的アクセス・モードのファイルの場合にも、フォーマット 2 を指定 する必要があります。
READ ステートメントの実行方法は、以下のセクションに説明するように、 ファイル編成に応じて異なります。
フォーマット 2 の READ ステートメントが実行されると、参照キーの値が、 ファイル・レコードの中にある対応するキー・データ項目の値と比較されます。 この比較は、一致した値を持つ最初のレコードが見つかるまで行われます。見つかったレコードはファイル位置標識が位置付けられ、 そしてそのレコードが使用可能になります。 値の一致するレコードが見つからない場合には、INVALID KEY 条件が起こり、 READ ステートメントの実行は失敗に終わります。 (無効キー条件の詳細については、無効キー条件を参照してください。)
KEY 句が指定されていなければ、基本 RECORD KEY が、 この要求のために使用される参照キーとなります。 動的アクセスが指定されている場合、基本 RECORD KEY は、 別の参照キーが設定されるまで、 後続の順次 READ ステートメントの実行のための参照キーとしても使用されます。
KEY 句が指定されている場合には、データ名-1 がこの要求のために使用される参照キーになります。動的アクセスが指定されている場合、別の参照キーが設定されるまで、 この参照キーが後続の順次 READ ステートメントの実行のために使用されます。
フォーマット 2 の READ ステートメントを実行すると、RELATIVE KEY データ項目に含まれている 相対レコード番号を持つレコードが指し示されるようにファイル位置標識ポインターが設定され、そのレコードが使用可能になります。
ファイルに該当するレコードが含まれていなければ、INVALID KEY 条件が起こり、 READ ステートメントの実行は失敗に終わります。 (無効キー条件の詳細については、無効キー条件を参照してください。)
KEY 句を相対ファイルに対して指定することはできません。
索引付き編成または相対編成のファイルの場合は、ファイル制御項目の中で動的ア クセス・モードを指定することができます。動的アクセス・モードでは、 使用するフォーマットに応じて、 順次またはランダムのどちらかのレコード検索を使用することができます。
順次レコード検索のときには、NEXT 句を指定したフォーマット 1 を使用する必要があります。 順次アクセスに関するその他すべての規則がここでも適用されます。