Rational Developer for System z
COBOL for Windows バージョン 7.5 言語解説書


READ ステートメント

順次アクセスの場合、READ ステートメントはファイル内の次の論理レコードをオブジェクト・プログラムが使用できるようにします。 ランダム・アクセスの場合には、READ ステートメントは、 オブジェクト・プログラムが直接アクセス・ファイル内の指定したレコードを使用可能にします。

READ ステートメントを実行するときには、 関連するファイルを INPUT モードまたは I-O モードでオープンしておく必要があります。

フォーマット 1: 順次検索
構文図を読む構文図をスキップする>>-READ--ファイル名-1--+----------+--+--------+----------------->
                       +-NEXT-----+  '-RECORD-'  
                       '-PREVIOUS-'              
 
>--+------------+--+-----------------------------------+-------->
   '-INTO--ID-1-'  '-+----+--END--命令ステートメント-1-'  
                     '-AT-'                               
 
>--+----------------------------------------+--+----------+----><
   '-NOT--+----+--END--命令ステートメント-2-'  '-END-READ-'  
          '-AT-'                                             
 

フォーマット 2: ランダム検索
構文図を読む構文図をスキップする>>-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 句または PREVIOUS 句を 指定する必要があります。その場合、レコードが順次取り出されます。

PREVIOUS RECORD
レコードの論理的なシーケンスの中で前の位置にあるレコードを読み取ります。PREVIOUS は、DYNAMIC アクセス・モードの索引ファイルおよび相対ファイルに適用されます。

動的アクセス・モードでは、ファイルに対して NEXT 句または PREVIOUS 句を指定する必要があります。その場合、レコードが順次取り出されます。

READ...PREVIOUS を指定したが前の論理レコードが存在しない場合は、AT END 条件が発生し、READ ステートメントはエラーとなります。

READ...PREVIOUS を指定する場合、ファイル位置標識の設定を使用し、以下の規則に従って有効なレコードが判別されます。

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

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

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

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

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

  1. ファイル名-1 によって参照されるファイルが可変長レコードを含むと記述されている場合、グループ移動が行われます。
  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 が設定されてレコード長に不一致があったことを示します。

説明の開始。この図はレコード域の内容、次に読み取りの実行を示しています。疑問符 (?) は、新規レコードの範囲を超えるレコード域の未定義の内容を示しています。説明の終わり。

順次アクセス・モード

順次アクセス・モードの全ファイルについてフォーマット 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 ステートメントの実行は正しく行われません。関連付けられたレコード域の内容は未定義のままであり、 ファイル位置標識は有効な次のレコードが設定されていないことを示すように設定されます。

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 ステートメントの実行が失敗した後では、 関連するレコード域の内容は未定義であり、ファイル位置標識は、 有効な次のレコードが設定されていないことを示すように設定されます。読み込みの失敗に続いて、データにアクセスしたり、データをレコード域へ移動しようとすると、セグメンテーション違反という結果になる可能性があります。

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

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

PREVIOUS RECORD とは、キー・シーケンスで前に存在する論理レコードです。

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

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

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

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

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

AT END 条件

この条件が存在するのは、ファイル位置標識が、次の論理レコード (または前の論理レコード) が存在しないということ、またはオプションの入力ファイルが存在しないということを示している場合です。 前述の PREVIOUS RECORD についての説明を参照してください。

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 ステートメントに関する注意事項


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

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