Rational Developer for System z
Enterprise COBOL for z/OS バージョン 4.1 言語解説書


READ ステートメント

順次アクセスの場合、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-'   

ファイル名-1
データ部の FD 項目に定義されている必要があります。
NEXT RECORD
レコードの論理的なシーケンスの中で次の位置にあるレコードを読み取ります。NEXT は、アクセス・モードが順次である場合のオプショナ ルです。READ ステートメントの実行には影響がありません。

動的アクセス・モードのファイルの場合に、レコードを順次検索するためには NEXT RECORD 句を指定する 必要があります。

INTO ID-1
ID-1 は受け取りフィールドです。

ID-1 ID-1 は、選択された送り出しレコード記述項目に対して、MOVE ステートメントの規則に従う有効な受け取りフィールドでなければなりません。

ファイル名-1 に関連付けられたレコード域と ID-1 は、 同じストレージ域を占めることはできません。

ファイル名-1 に関連付けられたレコード記述が 1 つだけしかない場合、または ID-1 によって 参照されるすべてのレコードとデータ項目に基本英数字項目または英数字グループ項目が記述されている場合、 INTO 句を指定した READ ステートメントの実行結果は、 指定された順序で以下の規則を適用するのと同じことになります。

  • INTO 句を指定しないだけであとは同じ READ ステートメントを実行します。
  • 現行のレコードを CORRESPONDING 句を伴わない MOVE ステートメントの規則に従って、 そのレコード域から ID-1 によって指定された領域へ移動します。現在のレコードのサイズは、RECORD 節で指定された規則によって決定されます。 ファイル記述項目が RECORD IS VARYING 節を含む場合には、暗黙の移動はグループ移動になります。 READ ステートメントの実行が正しく行われなかった場合には、 暗黙の MOVE ステートメントの実行は行われません。 ID-1 に関連する添え字付けまたは参照変更があれば、レコードが読み取られた後、 データ項目に移動される直前に、それは評価されます。レコードは、そのレコード域と ID-1 によって参照されるデータ項目の両方で使用可能です。

    ID-1 が日付フィールドである場合は、日付フィールドが関係する移動で説明された動作に従って、 暗黙の MOVE ステートメントが実行されます。

ファイル名-1 に関連付けられたレコード記述が複数あり、それらのすべてに英数字グループ項目または基本英数字項目が記述されていない場合は、以下の規則が適用されます。

  1. ファイル名-1 で参照したファイルが、可変長レコードを含んでいるとして記述され ている場合、あるいは RECORDING MODE 'S' または 'U' が指定された QSAM ファイルとして記述されている場合は、グループ移動が行われます。
  2. ファイル名-1 で参照したファイルが、固定長レコードを含んでいるとして記述されている場合は、最大数の文字位置を指定しているレコードを送り出しフィールド記述として使用して、MOVE ステートメントの規則に従って移動が行われます。そのようなレコードが複数存在する場合には、 選択される送り出しフィールド・レコードは、該当するレコードのうちファイル名-1 の記述のもとで最初に現れるレコードとなります。

KEY IS 句

KEY IS 句は、索引ファイルに対してのみ指定できます。データ名-1 は、ファイル名-1 に関連付けられたレコード・キーと一致しなければなりません。データ名-1 を修飾することができます。添え字付けはできません。

AT END 句

順次アクセスの場合、AT END 句および利用可能な EXCEPTION/ERROR プロシージャーは、両方とも省略できます。

AT END 条件の処理に関する詳細は、AT END 条件を参照してください。

INVALID KEY 句

INVALID KEY 句および利用可能な EXCEPTION/ERROR プロシージャーは、両方とも省略することができます。

INVALID KEY 句の処理に関する情報は、無効キー条件を参照してください。

END-READ 句

この明示的範囲終了符号は、READ ステートメントの範囲を区切るために使用されます。 END-READ 句を使用することによって、 条件的な READ ステートメントを他の条件ステートメント内にネストすることができます。 END-READ 句は、READ 命令ステートメントと共に使用することもできます。 詳細については、範囲区切りステートメントを参照してください。

複数のレコードの処理

ファイル名-1 に関連付けられた複数のレコード記述項目がある場合、それらのレコ ードは自動的に同じストレージ域を共用します。つまり、それらは暗黙に再定義さ れます。READ ステートメントが実行された後、 現行レコードの範囲内にあるこれらのデータ項目のみが置換されます。 この範囲を超えて格納されているデータ項目は定義されていません。 以下の図では、この概念を説明しています。現在のレコードの範囲が、ファイル名-1 のレコード記述項目を超えている場合には、そのレコードは最大サイズまで右側が切り捨てられます。上記のどちらの場合も、READ ステートメントは正しく実行され、 入出力状況として 04 が設定されてレコード長に不一致があったことを示します。

この図では、FD 内の違うサイズの 2 つのレコード域を表しています。短い方のレコードが読み取られると、残りのレコード域の内容は未定義となります。

順次アクセス・モード

順次アクセス・モードの全ファイルについてフォーマット 1 を使用しなければなり ません。

フォーマット 1 の READ ステートメントを実行すると、ファイルから次の論理レコードが取り出されます。アクセスされる次のレコードは、ファイル編成によって決定されます。

順次ファイル

NEXT RECORD とは、レコードの論理的なシーケンスの中で次の位置にあるレコー ドのことです。NEXT 句を指定する必要はありません。 READ ステートメントの実行には影響がありません。

このファイルのファイル制御項目の中に SELECT OPTIONAL が指定してあり、 オブジェクト・プログラムのこの実行中にファイルが使用可能でない場合には、 最初の READ ステートメントの実行で AT END 条件が生じます。ただし、 ファイルが使用可能でないので、システム定義のファイル終了処理は実行されません。

AT END 条件

ファイル位置標識が、次の論理レコードが存在しないということ、 またはオプショナル入力ファイルが使用可能でないということを示している場合、 次のことが、以下に述べられている順に起こります。

  1. ファイル位置標識の設定値から得られた値が、ファイル名-1 関連する入出力状況の中に入れられ、AT END 条件が生じたことを示します。
  2. AT END 条件を起こすステートメントの中に AT END 句が指定されている場合、 制御はその AT END 句の中にある命令ステートメント-1 に移ります。ファイル名-1 に関連して USE AFTER STANDARD EXCEPTION プロシージャーが指定されていても、それは実行されません。
  3. AT END 句が指定されておらず、利用可能な USE AFTER STANDARD EXCEPTION プロシージャーが存在する場合は、 そのプロシージャーが実行されます。 そのプロシージャーからの戻りは、 READ ステートメントの終わりの後にある次の実行可能ステートメントになります。

    AT END 句および利用可能な EXCEPTION/ERROR プロシージャーは、両方とも省略できます。

    AT END 条件が起こると、READ ステートメントの実行は正しく行われません。関連付けられたレコード域の内容は未定義のままであり、 ファイル位置標識は有効な次のレコードが設定されていないことを示すように設定されます。

    QSAM ファイルの場合、読み取りの失敗の後、データにアクセスしたり、データをレコード域へ移動しようとすると、記憶保護例外という結果になる可能性があります。

READ ステートメントの実行中に AT END 条件が起こらなければ、 AT END 句は指定されていても無視され、以下の処置が行われます。

  1. ファイル位置標識が設定され、ファイル名-1 に関連付けられた入出力状況が更新されます。
  2. AT END 条件ではない例外条件が存在する場合、ファイル名-1 に対して適用可能な USE AFTER STANDARD EXCEPTION プロシージャーの実行後、READ ステートメントの終わりに制御が移されます。

    USE AFTER STANDARD EXCEPTION プロシージャーが指定されていなければ、 制御は READ ステートメントの終わりか、または命令ステートメント-2 が指定されていればそのステートメントに移されます。

  3. 例外条件が起こらなければ、レコード域にあるレコードが使用可能になり、INTO 句の存在による暗黙の移動が実行されます。 制御は、READ ステートメントの終わりか、または命令ステートメント-2 が指定していればそのステートメントに移されます。後者の場合には、命令ステートメント-2 の中に指定してある各ステートメントの規則に従って、実行は継続されます。 プロシージャー・ブランチまたは明示的な制御の移動を引き起こす条件ステートメントが実行される場合、 制御は、それを起こすステートメントの規則に従って移されます。 条件ステートメントが実行されない場合、命令ステートメント-2 の実行が完了するとすぐに、 制御が READ ステートメントの終了へと移されます。

READ ステートメントの実行が失敗した後では、 関連するレコード域の内容は未定義であり、ファイル位置標識は、 有効な次のレコードが設定されていないことを示すように設定されます。読み取りの失敗の後、データにアクセスしたり、デー タをレコード域へ移動しようとすると、記憶保護例外という結果になる可能性があ ります。

マルチボリューム QSAM ファイル

READ ステートメントの実行時、ボリュームの終わりが認識されても、論理的なフ ァイルの終わりに到達していない場合は、以下の処置が実行されます。

  • 標準の終了ボリューム・ラベル・プロシージャーが実行される
  • ボリュームの切り替えが発生する
  • 標準の開始ボリューム・ラベル・プロシージャーが実行される
  • 次のボリュームの最初のデータ・レコードが使用可能にされる

索引付きファイルまたは相対ファイル

NEXT RECORD とは、キー・シーケンスで次に続く論理レコードです。

索引付きファイルでは、キー・シーケンスは、現行参照キーの昇順となる値のシーケンスです。 相対ファイルでは、キー・シーケンスは、 ファイル内に存在するレコードが持つ相対レコード番号の昇順となる値のシーケンスです。

READ ステートメントを実行する場合は、OPEN、START、または READ ステート メントを正常に実行して、ファイル位置標識を事前に設定しておく必要がありま す。 READ ステートメントが実行されると、 ファイル位置標識で示されるレコードがそのファイル位置標識によって示されるパスを通してアクセス可能であるならば、 そのレコードが使用可能にされます。

レコードがすでにアクセス可能でなくなっている場合(例えば削除されてしまった ために)、ファイル位置標識はファイル内の次の既存レコードを指し示すように更新 され、そのレコードが使用可能にされます。

順次アクセス・モードのファイルの場合は、NEXT 句を指定する必要はありません。

動的アクセス・モードのファイルの場合、レコードを順次検索するためには、NEXT 句を指定しなければなりません。

AT END 条件

この条件が存在するのは、ファイル位置標識が、次の論理レコードが存在しないと いうこと、またはオプショナル入力ファイルが使用可能でないということを示している 場合です。順次ファイルの場合と同じプロシージャーが実行されます (AT END 条件を参照)。

READ ステートメントの実行の間に、AT END 条件も無効キー条件も起こらなければ、 AT END 句や INVALID KEY 句は指定されていても無視されます。順次ファイルで AT END 条件が起こらなかった場合と同じプロシージャーが実行されます (AT END 条件を参照)。

順次にアクセスされる索引付きファイル

DUPLICATES の指定のある ALTERNATE RECORD KEY が参照キーである場合には、 重複するキー値を持つファイル・レコードは、 それらがファイルに入れられた際の順序で使用可能にされます。

順次にアクセスされる相対ファイル

ファイルに対して RELATIVE KEY 節が指定されている場合は、 READ ステートメントが実行されると、 使用可能なレコードの相対レコード番号を示すために、 RELATIVE KEY データ項目が更新されます。

ランダム・アクセス・モード

ランダム・アクセス・モードの索引付きファイルおよび相対ファイルに対しては、 フォーマット 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 を使用する必要があります。 順次アクセスに関するその他すべての規則がここでも適用されます。

READ ステートメントに関する注意事項

  • ファイル制御項目に FILE-STATUS 節の指定がある場合は、関連するファイル状況キーが READ ステートメントの実行で更新されます。
  • READ ステートメントの実行が失敗した後では、関連するレコード域の内容とフ ァイル位置標識の値は未定義です。読み取りの失敗の後、データにアクセスしたり、デー タをレコード域へ移動しようとすると、記憶保護例外という結果になる可能性があ ります。

ご利用条件 | フィードバック

このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)