順呼び出しの場合、READ(読み込み)文はファイルから次
または前の
論理レコードを利用できるようにする。乱呼び出しの場合、READ文は大記憶ファイルから指定されたレコードを利用できるようにする。
一般形式
形式 1 (レコード順編成ファイル)
形式 2 (行順編成ファイル)
形式 3 (相対ファイルおよび索引ファイル)
形式 4 (相対ファイル)
形式 5 (索引ファイル)
指令およびランタイム スイッチ
予約語リストにフラグを付けたり修正したりするコンパイラ指令に加えて、下記の指令によって、この項に記述した構文または意味が影響を受ける可能性がある。
RETRYLOCK - ロックされているレコードの読み込みを再試行させる。
下記のランタイム スイッチによって、この項に記述した意味が影響を受ける可能性がある。
B, B1 - READ NEXT文を実行中にロックされたレコードが出てくると、それを飛ばすようにレコード ポインターを更新させる。
N - 行順レコードを読むときに、制御文字の前の空文字の解釈を制御する。
T - 行順レコードを書くときに、タブ文字の解釈を制御する。
構文規則
すべての形式 (すべてのファイル)
入力ファイルの論理レコードが可変長のとき、INTO指定を使用してはならない。
この制限は削除された。
一意名のデータの記憶領域とファイル名のレコードの記憶領域とが、同じ記憶領域を指してはならない。
一意名は、浮動小数点数データ項目でもよい。
ファイル名に適用できるUSE手続きを設定していない場合には、INVALID KEY指定またはAT END指定を書く。
この規則は強制ではない。
形式 1、3、4 および 5 (レコード順編成ファイル、相対ファイル、索引ファイル)
WITH LOCKを指定できるのは、共有ファイル中で単一のレコードを手入力でロックする場合だけである。
WITH NO LOCKを指定できるのは、共有ファイル中でレコードをマニュアルまたは自動的にロックする場合だけである。
形式 3 (相対ファイルおよび索引ファイル)
動的呼び出し法でレコードを順検索する場合は、NEXT
またはPREVIOUS
を指定する。
形式 3、4 および 5 (相対ファイルおよび索引ファイル)
WITH KEPT LOCKを指定できるのは、共有ファイル中で複数のレコードを手入力でロックする場合だけである。
形式 4 および 5 (相対ファイルおよび索引ファイル)
乱呼び出し法または動的呼び出し法でファイルのレコードを乱検索する場合は、形式 4または5を用いる。
形式 5 (索引ファイル)
データ名
または分割キー名
は、ファイル名のファイルのレコードキーとして指定したデータ項目の名前とする。
データ名はまた、ファイル名と対応するレコードキーとして指定した、データ項目の再定義となり、同じ長さをもつデータ名を作ることもできる。
再定義は、レコードキーと異なる長さをもつことがある。
データ名
または分割キー名
は、修飾してもよい。
分割キー名は、ファイル名のファイルのレコード キーとして指定したいくつかのデータ項目を結合したものである。
一般規則
すべての形式 (すべてのファイル)
READ文を実行するときには、対象のファイルを入力モードまたは 入出力モードで開いておく。(手続き部 - MERGE - OPEN の章のOPEN(開く)文OPEN(開く)文 節を参照。)
READ文を実行すると、ファイル名に対応するFILE STATUSデータ項目が存在すれば、その値が更新される。(手続き部 の章の入出力状態 節を参照。)
1つのファイルの論理レコードが複数のレコード記述によって定義されている場合、それらのレコードは自動的に同じ記憶領域を共有する。これはレコード領域を暗黙的に再定義することに相当する。現在のレコード領域の範囲を超えてデータ項目が存在する場合、READ文の実行が終了したときにその内容はどうなっているかわからない。
INTOを指定すると、読み込まれたレコードは、レコード領域から一意名に指定した領域へ転記される。その際、CORRESPONDING指定のないMOVE文に関する規則が適用される。READ文の実行が不成功であったときは、この暗黙的な転記は行われない。一意名に添字付けまたは指標付けがなされている場合、レコードが読み込まれてからその一意名のデータ項目に転記される直前に評価される。
INTOを指定すると、読み込まれたレコードは、入力レコード領域でも一意名のデータ領域でも利用可能となる。
ファイル位置指示子が次の論理レコードが存在しないことを示しているか、または不定入力ファイルが存在しない場合、下記の処理が順に行われる。
ファイル位置指示子の内容に応じた値が、ファイル名-1に対応する入出力状態に設定される。 (手続き部 の章の入出力状態 節を参照。)
AT END指定をしてあると、制御は無条件文-1に移される。この場合、ファイル名-1のファイル結合子に対応するUSE AFTER EXCEPTION手続きが設定してあっても実行されない。その後、無条件文-1の中の各文に関する規則に従って、処理は続行される。その中で、制御の明示をもたらす分岐文または条件文が実行された場合は、その文に関する規則に従って制御が移される。そうでなければ、無条件文-1の実行が終了した時点で、制御はREAD文の末尾に移される。この場合、NOT AT END指定があっても、無視される。
AT END指定をしていない場合、ファイル名-1に対応するUSE AFTER STANDARD EXCEPTION手続きを設定する必要がある。この場合、そのUSE手続きが実行される。その実行が終了すると、READ文の末尾の次の実行文に制御が戻される。
AT END条件が発生した場合、READ文の実行は不成功になる。
READ文の実行が不成功に終わった後では、対応するレコード領域の内容はどうなっているかわからない。また、ファイル位置指示子は、次のレコードが存在しないことを示すように設定される。
形式 1 (レコード順編成ファイル)
READ文によって利用可能となるレコードは、下記のように決定される。
OPEN文の実行によってファイル位置指示子の位置が設定されている場合は、ファイル位置指示子が指すレコードが利用できるようになる。
前のREAD文の実行によってファイル位置指示子の位置が設定されている場合は、ファイル位置指示子が次のレコードを指すように >更新され、そのレコードが利用できるようになる。
しかし、前のREAD文によってレコードがロックされている場合は、ファイル位置指示子は変更されない。そのファイル位置指示子が指すレコードが利用できるようになる。
READ文の実行中にリールまたはユニットの終わりが検出されたが、まだファイルの終わりには達していない場合、下記の手続きが実行される。
標準終了リール/ユニット ラベル手続き
リール/ユニットの交換
標準開始了リール/ユニット ラベル手続き
新しいリール/ユニットの最初のデータ レコードの読み込み
OPTIONAL指定をしたファイルを開こうとしたときにそのファイルが存在しないと、そのファイルに対して最初にREAD文が実行されたときにAT END条件が発生し、READ文の実行は不成功に終わる。標準のファイル終了手続きは実行されない。(環境部 の章のファイル管理段落ファイル管理段落 節、手続き部 - MERGE - OPEN の章のOPEN(開く)文 節、および手続き部 - SEARCH - XML PARSE の章のUSE(使用)文 節を参照。) その後、
実行は、一般規則13に記してあるように進む。ファイル管理段落
INPUT用に開かれたファイルに関しては、READ文、READ WITH LOCK文、およびREAD WITH KEPT LOCK文のいずれもレコード ロックを得ることはない。
レコード ロック方式がAUTOMATICまたはMANUALである1つの順編成ファイルを複数の実行単位からEXTENDを指定して開くと、そのファイルが共有される。ただし、そのファイルの後ろに追加されるレコードの順序は保証されない。
I-O用に開かれたファイルに関しては、以下のようになる。
ファイルにLOCK MODE IS AUTOMATICが指定してあると、READ文にWITH NO LOCKを指定しないかぎり読み込まれた各レコードはロックされる。
ファイルにLOCK MODE IS MANUALが指定してあると、READ文ではレコード ロックを得ることはできない。レコード ロックを得るためには、READ WITH LOCK文を使用する。READ文にWITH NO LOCKを指定しても、注記になる。
レコード ロックがいつ解除されるかは、単一のレコードをロックしたか複数のレコードをロックしたかによって異なる。 (環境部 の章ののファイル管理記述項ファイル管理段落 節を参照。)
ある実行単位からはI-OまたはINPUT用に開き、別の実行単位からはEXTEND用に開いたファイルに対してREAD文を実行した際に、ファイル終了状態が発生した場合、そのREAD文を実行しようとした実行単位側でそのファイルを閉じなければならない。そのファイルの状態は終了のまま残るため、その実行単位からはファイルの後ろに追加されたレコードを呼び出すことはできない。
形式 1、2 および 3 (順編成ファイル、相対ファイル、および索引ファイル)
READ文の実行中にAT END条件が発生しなかった場合、AT END指定をしてあっても無視されて、以下の処理が行われる。
ファイル位置指示子が設定されて、ファイル名-1に対応する入出力状態が更新される。
ファイル終了条件以外の例外条件が発生していると、ファイル名-1に適用できるUSE AFTER EXCEPTION手続きが指定してあればそれが実行されて、その後でUSE文の規則に従って制御が移される。(手続き部 - SEARCH - XML PARSE の章のUSE(使用)文 節を参照。)
例外条件が何も発生していなければ、読み込み対象レコードがレコード領域中で利用できるようにされる。また、INTOを指定してあれば、暗黙の転記処理が行われる。その後で、制御はREAD文の末尾に移される。ただし、NOT AT END指定をしてあれば、制御は無条件文-2に移される。この場合、無条件文-2の中の個々の文に関する規則に従って、以降の処理が続行される。制御の明示移行をもたらす分岐文または条件文が実行された場合は、その文に関する規則に従って制御が移される。制御の明示移行をもたらす分岐文または条件文が実行されなかった場合は、無条件文-2の実行が終わると、制御はREAD文の末尾に移される。
NEXT指定をしたREAD文を実行したときに、対象ファイル中に次の論理レコードが存在しないと、AT END条件が発生しREAD文の実行は不成功に終わったものとみなされる。(手続き部 の章の入出力状態 節を参照。)
順編成ファイルまたは
順呼び出し法で呼び出すファイルに関しては、NEXT指定は書いても書かなくてもよい。READ文の実行には影響を及ぼさない。.
形式 3 (相対ファイルおよび索引ファイル)
読み込んだレコードがロックされていると、ファイル位置指示子はそのレコードを指すように設定される。以降、READ NEXT文またはREAD PREVIOUS文は同じレコードを再び取り出す。
NOT AT END指定は、READ文の実行が正常に終了した場合にだけ実行される。
PREVIOUS指定をしたREAD文を実行したときに、対象ファイル中に前の論理レコードが存在しないと、AT END条件が発生しREAD文の実行は不成功に終わったものとみなされる。
AT END条件が検出された場合、前の論理レコードが存在しないため、
そのファイルに対して次に形式 3 のREAD文を実行するならば、NEXTを指定する。そうでなければ、
下記の処理を続ける。
該当するファイルに対してCLOSE文を実行し、次いでOPEN文を実行する。いずれも正常に終了しなければならない。
そのファイルに対してSTART文を実行する。正常に終了しなければならない。
そのファイルに対して、形式 4(相対ファイル)または形式 5(索引ファイル)のREAD文を実行する。
動的呼び出し法を指定したファイルに関して、NEXT指定をしたREAD文を実行すると、
一般規則8に記述したように
次の論理レコードが取り出される。
READ文によって利用可能となるレコードは、下記の規則に従って決定される。
OPEN文の実行によってファイル位置指示子が設定されているところへPREVIOUSを指定したREAD文を実行すると、AT END条件が発生する。
START文またはOPEN文の実行によってファイル位置指示子が設定されていて、ファイル位置指示子によって指されるレコードの呼び出しができる場合は、そのレコードが利用可能にされる。相対ファイルのレコードを削除したり索引ファイルの副レコードキーを変更したりすることによって、レコードが呼び出しできる状態になった場合は、参照キーによって確立されている呼び出し経路中の次のレコードを指すように、ファイル位置指示子が更新される。
ただし、PREVIOUS指定をしていると、
前のレコードを指すように、ファイル位置指示子が更新される。そして、ファイル位置指示子によって指されるレコードが利用可能にされる。
前のREAD文の実行によってファイル位置指示子が設定された場合、ファイル位置指示子はファイル中に存在する次のレコードを指すように更新される。
ただし、PREVIOUS指定をしていると、前のレコードを指すように、ファイル位置指示子が更新される。
前のREAD文によってレコードがロックされた場合は、ファイル位置指示子は変更されない。そして、ファイル位置指示子によって指されるレコードが利用可能にされる。
形式 1、3、4 および 5 (順編成ファイル、相対ファイル、索引ファイル)
単一のレコードを手入力でロックするように指定したファイルを入出力両用に開くと、READ文にWITH LOCK指定をしたときにだけ、実行単位はレコード ロックを取得する。単なるREAD文では、レコード ロックを得ることはできない。ロックされているレコードを読み飛ばすためには、START文を用いてファイル位置指示子を更新する。ただし、キーの重複を認めている副レコードキーに関しては、この方法を採ることはできない。
複数のレコードを手入力でロックするように指定したファイルを入出力両用に開くと、READ文にWITH KEPT LOCK指定をしたときにだけ、実行単位はレコード ロックを取得する。単なるREAD文では、レコード ロックを得ることはできない。ロックされているレコードを読み飛ばすためには、START文を用いてファイル位置指示子を更新する。ただし、キーの重複を認めている副レコードキーに関しては、この方法を採ることはできない。
WITH WAIT指定をすると、必要があれば待ってでも、レコード ロックが必ず取得される。
形式 3 (相対ファイル)
RELATIVE KEYを指定したファイルに対してREAD文を実行すると、利用可能にされたレコードの相対レコード番号が、RELATIVE KEYデータ項目に収められる。
形式 4 (相対ファイル)
READ文を実行すると、ファイルのRELATIVE KEYに指定したデータ項目中に保持されている相対レコード番号がファイル位置指示子に設定され、そのレコードが利用可能にされる。ファイル中にその相対レコード番号のレコードが存在しない場合は、無効キー条件が発生し、READ文の実行は不成功に終わる。(手続き部 の章の無効キー条件 節を参照。)
形式 3 および 5 (相対ファイルおよび索引ファイル)
IGNORE LOCK指定をすると、READ文はレコードがロックされていないかのように実行される。
形式 3 (索引ファイル)
索引ファイルを順呼び出しする場合、検索のキーとしている副レコードキーに値が同じものがあると、これらはWRITE文またはREWRITE文によって書き出された順に利用可能にされる。
形式 5 (索引ファイル)
KEY指定をしないと、主レコードキーが検索キーとして使用される。動的呼び出しを指定すると、後に形式 3 のREAD文を実行するときにも、この検索キーが使用される。
KEY指定をすると、データ名-1
または分割キー名
がその参照キーとして使用される。動的呼び出しを指定すると、後に形式 3のREAD文を実行するときにも、この検索キーが使用される。ただし、別の参照キーを指定すると、今度はそれが使用されるようになる。
形式 5のREAD文を実行すると、参照キーの値がファイル中のレコードの対応するデータ項目に格納されている値と順次比較されて、両者の値が最初に一致するものが見つけ出される。ファイル位置指示子がそのレコードを指すように設定されて、そのレコードが利用可能とされる。両者の値が一致するレコードが見つからないと、無効キー条件が発生し、READ文の実行は不成功に終わる。(手続き部 の章の無効キー条件 節を参照。)