get next

EGL get next 文は、ファイルまたはメッセージ・キューから次のレコードを読み取るか、データベースから次の行を読み取ります。

get next 文の構文図
record name
入出力オブジェクトの名前。索引付きレコード、MQ レコード、相対レコード、シリアル・レコード、SQL レコードなどを指定します。
from resultSetID
SQL 処理のみに使用する、同じプログラム内で前に実行された open ステートメントに get next ステートメントを結合する ID。 詳細については、『resultSetID』を参照してください。
into
リレーショナル・データベース表から値を受け取る項目がリストされた文節の中で、EGL を開始します。
item
特定の列の値を受け取る項目。 項目名の前にはコロン (:) を付けません

ファイル・アクセスの例を次に示します。

  try
    open record1 forUpdate;
    onException
      myErrorHandler(8);
      return;
  end
  try
    get next record1;
    onException
      myErrorHandler(12);
      return;
  end
  
  while (record1 not endOfFile)
    makeChanges(record1); // レコードのプロセス

    try
      replace record1;
    onException
      myErrorHandler(16);
      return;
    end
    
    try
      get next record1;
    onException
      myErrorHandler(12);
      return;
    end
  end  // end while
  
  sysLib.commit();

get next 文の詳細は、レコード・タイプによって異なります。SQL 処理の詳細については、『SQL 処理』を参照してください。

索引付きレコード

get next 文が索引付きレコードに対して操作を行う場合、効果は現在のファイル位置に基づいたものとなります。この位置は、以下のどちらかの操作によって設定されます。
  • get 文または別の get next 文などの正常な入出力 (I/O) 操作
  • set record position という書式の set
規則は以下のとおりです。
  • ファイルが開かれていない場合は、get next 文はファイル内のキー値が最も低いレコードを読み取る。
  • 以降の各 get next 文は、現在のファイル位置との関係でキー値が次に高いレコードを読み取る。 複写キーの場合の例外については、後で説明します。
  • get next 文がファイル内のキー値が最も高いレコードを読み取った後、次の get next 文の結果は I/O エラー値 endOfFile になる。
  • 現在のファイル位置は、以下の操作の影響を受ける。
    • set record position という書式の EGL set 文は、set value に基づいてファイル位置を設定する。この値は、set 文によって参照される索引付きレコード内のキー値です。同じ索引付きレコードに対する以降の get next 文は、キー値が set value と等しいかより大きいファイル・レコードを読み取ります。そのようなレコードが存在しない場合は、get next の結果は endOfFile になります。
    • get next 文以外の正常な I/O 文は、 新しいファイル位置を設定し、同じ EGL レコードに対して発行される後続の get next 文は、次の ファイル・レコードを読み取る。例えば、get previous 文がファイル・レコードを読み取った後、get next 文は、キーが次に高いレコードを読み取るか endOfFile を戻します。
    • get previous 文が endOfFile を戻した場合、後続の get next 文は、ファイルの最初のレコードを検索する。
    • 異常終了した getget next、または get previous 文の後、ファイル位置は未定義となり、set record position 書式の set 文によって再設定するか、get next または get previous 文以外の入出力操作によって再設定する必要がある。
  • 代替索引を使用している場合で、ファイル内に複写キーがある場合は、以下の規則が適用される。
    • キーの値がより高いレコードの検索は、get next 文が、検索された最新のレコードと同じキーを持つすべてのレコードを読み取った後でのみ行われる。複写キー付きレコードが検索される順序は、VSAM がレコードを戻す順序になります。
    • get nextget next 以外の正常な入出力操作に続く場合、その get next は複写キー付きレコードをスキップオーバーし、キー値が次に高いレコードを検索する。
    • プログラムが同じキーを含むレコード・グループ内の最終レコードを検索した場合、EGL エラー値 duplicate は設定されない。
キーが以下のようになっているファイルを考えてみましょう。
  1, 2, 2, 2, 3, 4

以下の各表は、同じ索引付きレコードに対して一連の EGL ステートメントを実行する場合の効果を示しています。

次に示す 2 つの表は、EGL で生成された COBOL コードに適用されます。

EGL ステートメント (実行順) 索引付きレコード内のキー 文によって検索されるファイル・レコード内のキー COBOL の場合の EGL エラー値
get 2 2 (3 つある内の最初のもの) duplicate
get next any 3

EGL ステートメント (実行順) 索引付きレコード内のキー 文によって検索されるファイル・レコード内のキー COBOL の場合の EGL エラー値
set record position 書式の set 2 検索されない duplicate
get next any 2 (3 つある内の最初のもの) duplicate
get next any 2 (2 番目のもの) duplicate
get next any 2 (3 番目のもの)
get next any 3

次に示す 2 つの表は、EGL で生成された Java™ コードに適用されます。

EGL ステートメント (実行順) 索引付きレコード内のキー 文によって検索されるファイル・レコード内のキー Java の場合の EGL エラー値
get 2 2 (3 つある内の最初のもの) duplicate
get next any 2 (2 番目のもの) duplicate
get next any 2 (3 番目のもの)
get next any 3

EGL ステートメント (実行順) 索引付きレコード内のキー 文によって検索されるファイル・レコード内のキー Java の場合の EGL エラー値
set record position 書式の set 2 検索されない duplicate
get next any 2 (3 つある内の最初のもの)
get next any 2 (2 番目のもの) duplicate
get next any 2 (3 番目のもの)
get next any 3

メッセージ・キュー

get next が MQ レコードに対して操作を行う場合は、キュー内の最初のレコードが MQ レコードに読み込まれます。この追加処理は、get next で、以下に示す 1 つ以上の MQSeries® 呼び出しが呼び出されることによって行われます。

相対レコード

get next 文が相対レコードに対して操作を行う場合、効果は現在のファイル位置に基づいたものとなります。この位置は、get 文または別の get next 文などの正常な入出力操作によって設定されます。規則は以下のとおりです。
  • ファイルが開かれていない場合は、get next 文はファイル内の最初のレコードを読み取る。
  • 以降の各 get next は、現在のファイル位置との関係でキー値が次に高いレコードを読み取る。
  • 次のレコードが削除されている場合、get nextnoRecordFound を戻さない。代わりに、get next は削除されたレコードをスキップしてファイル内の次のレコードを検索します。
  • get next 文がファイル内のキー値が最も高いレコードを読み取った後、次の get next 文の結果は EGL エラー値 endOfFile になる。
  • 現在のファイル位置は、以下の操作の影響を受ける。
    • get next 以外の正常な I/O 文は、新しいファイル位置を設定し、同じ EGL レコードに対する後続の get next次の ファイル・レコードを読み取る。
    • 異常終了した getget next、または get previous 文の後、ファイル位置は未定義となり、set record position 書式の set 文によって再設定するか、get next 文以外の入出力操作によって再設定する必要がある。
  • get next 文がファイル内の最終レコードを読み取った後、次の get next 文の結果は EGL エラー値 endOfFile および noRecordFound になる。

シリアル・レコード

get next 文がシリアル・レコードに対して操作を行う場合、効果は現在のファイル位置に基づいたものとなります。この位置は、別の get next によって設定されます。規則は以下のとおりです。
  • ファイルが開かれていない場合は、get next 文はファイル内の最初のレコードを読み取る。
  • 以降の各 get next は次のレコードを読み取る。
  • get next 文がファイル内の最終レコードを読み取った後、後続の get next 文の結果は EGL エラー値 endOfFile になる。
  • 生成されたコードによってシリアル・レコードが追加され、同じファイルに get next と 同等の文が発行されると、EGL は get next 文が実行される前に、 ファイルを閉じ、再オープンする。 したがって、add 文の後に実行される get next 文では、ファイル内の最初のレコードが読み取られます。この振る舞いは、get next 文と add 文が別々のプログラムにあり、一方のプログラムで他方のプログラムが呼び出される場合にも起こります。

複数のプログラムで同時に同じファイルが開かないようにしておくことをお勧めします。

制限: CICS® for z/OS® では、同じスプール・ファイルに関する add 文と get next 文を組み合わせて 1 つのプログラムに組み込むことはできません。この制限は、get next 文と add 文が別々のプログラムにあり、一方のプログラムが他方のプログラムを呼び出す場合にも適用されます。

SQL 処理

get next ステートメントが SQL レコードに対して操作を行う場合は、コードでは open ステートメントによって選択された行の中から次の行が読み取られます。 get next 文を発行し、forUpdate オプション付きの open 文により選択された行を検索すると、 以下のことを実行できます。
  • EGL replace 文で行を変更する
  • EGL delete 文で行を除去する
  • EGL execute 文で行を変更または除去する

SQL FETCH ステートメントは、生成されたコードでは EGL get next ステートメントを表します。生成される SQL ステートメントの形式は、INTO 文節の設定以外は変更できません。

最後に選択された行を超えた行へのアクセスを試みる get next 文を発行すると、次のようになります。
  • データは結果セットからコピーされません。
  • EGL は SQL レコード (もしあれば) を noRecordFound に設定します。
  • 関連する open 文が scroll オプションを含んでいた場合、カーソルは開かれたまま残り、カーソル位置は変更されません。scroll オプションは、Java で出力を生成している場合にのみ有効です。
  • scroll オプションを設定しなかった場合、カーソルは閉じられます。

最終的に、SQL COMMIT または sysLib.commit が指定された場合、open ステートメントで hold オプションを使用したときにのみ、open ステートメントで宣言されていたカーソル内の位置がコードにより保存されます。

ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.
(C) Copyright IBM Japan 2005.