COBOL2002 言語 拡張仕様編


4.4.1 READ文(索引ファイル機能の拡張)

形式

書き方1 順アクセスのREAD文

[図データ]

書き方2 乱アクセスのREAD文

[図データ]

機能

順アクセスのREAD文は,START文で決定したアクセス順序に従い,ファイルの次の,または前のレコードを使用できるようにする。

乱アクセスのREAD文は,大記憶ファイルの指定されたレコードを使用できるようにする。

構文規則
  1. 一意名1の記憶領域とファイル名1のレコード領域とは,同じであってはならない。

  2. データ名1は,ファイル名1に関連するレコードキーとして指定されたデータ項目でなければならない。

    合成キー名1は,SOURCE指定,または=指定のあるRECORD KEY句,SOURCE指定,FOR指定,または=指定のあるALTERNATE RECORD KEY句に書かれた合成キー名を指定する。

  3. データ名1は,修飾してもよい。合成キー名1は,ファイル名で修飾できる。

  4. 順アクセス法のファイルにアクセスするときには,書き方1を用いる。

  5. 動的アクセス法のファイルのレコードを順アクセスするときには,NEXT指定またはPREVIOUS指定を書かなければならない。

  6. 動的アクセス法のファイルのレコードを乱アクセスするときには,書き方2を用いる。

  7. 動的アクセス法のファイルを乱アクセスした後,NEXT指定によって順アクセスする場合,これ以降レコードのアクセスはキーの上昇順に行われる。

  8. ファイル名1にUSE手続きがないときは,INVALID KEY指定またはAT END指定を書かなければならない。

一般規則
  1. ファイル名1のファイルは,READ文を実行する前に入力モードまたは入出力両用モードで開いておかなければならない。

  2. 順アクセス法の索引ファイルに対して,NEXTを指定した場合,またはNEXT指定およびPREVIOUS指定のどちらも省略した場合は,START文による指定に従って,そのファイルから次の,または前のレコードにアクセスする。PREVIOUSを指定した場合は,START文による指定に関係なく,そのファイルから前のレコードにアクセスする。

  3. READ文の実行によって,ファイル名1に関連する入出力状態の値が更新される。

  4. 無条件文2または無条件文4を指定すると,レコードはその実行前に使用できるようになる。無条件文2または無条件文4を指定しないと,レコードはREAD文に続く文の実行前に使用できるようになる。

  5. このファイルにレコード記述項が二つ以上あるときには,それらのレコードは再定義の規則に従って記憶領域中の同じレコード領域を共用する。READ文の実行が完了したときの,現在レコードの範囲を超えた位置にあるデータ項目の内容は保証しない。

  6. INTO指定のあるREAD文の実行結果は,次に示す規則の順に適応したものと等しい。

    (a)INTO指定のないREAD文の実行。

    (b)現在レコードがCORRESPONDING指定のないMOVE文の規則に従って,レコード領域から一意名1の領域へ転記される。現在レコードのサイズは,RECORD句の規則で定める。暗黙の転記は集団項目転記となる。

    このレコードは,入力レコード領域と一意名1のデータ項目の両方で使用できるようになる。READ文の実行が不成功になったときには,この転記はされない。一意名1に付けた添字は,レコードを読んだ後で転記する直前に評価される。

  7. ファイル位置指示子が,次のレコードがないことを示しているとき,次の順序で動作する。

    (a)ファイル位置指示子の設定に従って,ファイル終了条件を示す値が,ファイル名1に関連する入出力状態に設定される。

    (b)READ文にAT END指定を書くと,AT END指定の無条件文1が実行される。ファイル名1に関連するUSE手続きは実行されない。

    (c)READ文にAT END指定を書かないと,ファイル名1に関連するUSE手続きを書かなければならず,USE手続きが実行される。その手続きからは,READ文に続く次の実行文に復帰する。ファイル終了条件になると,その条件を起こしたREAD文の実行ができなくなる。

  8. READ文の実行でファイル終了条件または無効キー条件のどれも起こらなかったとき,AT END指定またはINVALID KEY指定があっても無視され,次のように動作する。

    (a)ファイル位置指示子が設定され,そのファイル名1に関連する入出力状態が更新される。

    (b)ファイル終了条件または無効キー条件のどれでもない例外条件になったとき,ファイル名1に関連するUSE手続きが実行された後,USE文の規則に従って制御が移される。

    (c)例外条件にならなかったとき,レコードは,レコード領域で使用できるようになり,INTO指定があれば暗黙に転記される。制御は,READ文の終わり,または無条件文2が指定されていれば,そこに移る。後者の場合,無条件文2で指定されている各文の規則に従って実行が続く。明示的な分岐または条件文が実行されたとき,制御はその文の規則に従って移され,その他では,無条件文2の実行の完了によって,制御がREAD文の終わりに移る。

  9. READ文の実行ができなくなった後の,関連するレコード領域の内容および索引ファイルの参照キーは規定しない。ファイル位置指示子には,有効な次のレコードが確立しなかったことが設定される。

  10. 書き方1のREAD文の実行が開始されるときのファイル位置指示子の設定値は,次の規則に従って,使用できるレコードを定めるために使用される。

    索引ファイルでのレコードの比較は,現在の参照キーの値による。

    (a)ファイル位置指示子が,有効な次のレコードがないことを示しているとき,READ文の実行は不成功となる。

    (b)先に実行されたOPEN文またはSTART文によってファイル位置指示子が設定されているとき,そのファイル位置指示子より大きいかまたは等しい(レコード下降順アクセスのときは小さいかまたは等しい)キー値を持つレコードが選択される。

    (c)先に実行されたREAD文によってファイル位置指示子が設定されているときで,かつ現在の参照キーが重複を許さない索引ファイルに対してのとき,そのファイル位置指示子より大きい(レコード下降順アクセスのときは小さい)キー値を持つレコードが選択される。

    (d)先に実行されたREAD文によってファイル位置指示子が設定されているときで,かつ現在の参照キーが重複を許す索引ファイルに対してのとき,選択されるレコードは次のどれかである。

    ・キー値がファイル位置指示子に等しく,かつ,その重複したレコードキー値を持つレコードの組の中で,先に実行されたREAD文で使用できるようになったレコードの論理的に直後(レコード下降順アクセスのときは直前)にあるレコード

    ・キー値がファイル位置指示子より大きい(レコード下降順アクセスのときは小さい)最初のレコード

     上記の規則を満たすレコードが見つかると,そのレコードがファイル名1に関連するレコード領域で使用できるようになる。

     上記の規則を満たすレコードが見つからないとき,ファイル位置指示子は次のレコードが存在しないことを示すように設定され,一般規則7に従って実行が続けられる。

     レコードが使用できるようになると,ファイル位置指示子には使用できるようになったレコードのレコード番号またはキー値が設定される。

  11. 読み込んだレコードのサイズがファイル名1のレコード記述項で指定された最小のサイズより小さいとき,読み込まれた最後の有効な文字の右にあるレコード領域の部分の内容は不定である。読み込んだレコードのサイズがファイル名1のレコード記述項で指定された最大のサイズより大きいとき,レコードは右側が切り捨てられて最大のサイズとなる。どの場合も,入出力状態はレコード長の不整合を示すように設定される。

  12. END-READ指定は,READ文の範囲を区切る。

  13. 動的アクセス法の索引ファイルに対して,NEXT指定のある書き方1のREAD文を書くと,START文による指定に従って,そのファイルから次の,または前のレコードにアクセスする。PREVIOUSを指定した場合は,START文による指定に関係なく,そのファイルから前のレコードにアクセスする。

  14. 副レコードキーを参照キーとして順アクセスするときに,その値で指定されるレコードは重複して存在することがある。その場合の順アクセスのREAD文は,WRITE文またはREWRITE文で重複した値を持つレコードを書き出した順に従って,(レコード下降順アクセスのときは書き出した順とは逆の順に)レコードにアクセスする。

  15. 書き方1のREAD文の参照キーは,関連するファイルに対して直前に実行されたOPEN,READまたはSTART文によって定まる。

  16. 書き方2のREAD文でKEY指定を書くと,そのデータ名1,または合成キー名1がこのREAD文の参照キーとなる。動的アクセス法の場合,そのファイルに対するそれ以降の書き方1のREAD文は,別の参照キーが指定されるまで,この参照キーを使用する。

  17. 書き方2のREAD文でKEY指定を書かないと,主レコードキーがこの文の参照キーとなる。動的アクセス法の場合,そのファイルに対するそれ以降の書き方1のREAD文は,別の参照キーが指定されるまで,この参照キーを使用する。

  18. 書き方2のREAD文を実行すると,ファイル位置指示子に参照キーの値が設定される。この値は,ファイルのレコード中の対応するデータ項目の値と一致する最初のレコードが見つかるまで比較される。副レコードキーが重複した値を持つとき,最初に見つかるレコードは,大記憶管理システムに渡された重複した副レコードキー値を持つ一連のレコードの最初(レコード下降順アクセスのときは最後)のものである。一致するレコードがあると,ファイル名1に関連するレコード領域で使用できるようになる。一致するレコードがないとき無効キー条件になり,READ文の実行ができなくなる。

【標準仕様との関連】

COBOL2002 言語 標準仕様編」 「10.8.33 READ文