get next

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

get next 文の構文図
record name
入出力オブジェクトの名前。DLISegment レコード、索引付きレコード、MQ レコード、相対レコード、シリアル・レコード、SQL レコードなどを指定します。
forUpdate
ファイルまたはデータベースから検索されたデータを置換または削除するために以降の EGL 文を使用することができるオプション。

リソースがリカバリー可能である場合 (SQL データベースのケースのように)、レコードは forUpdate オプションによってロックされるため、コミットが発生するまで他のプログラムから変更することはできません。コミット処理の詳細については『作業論理単位』を参照してください。

usingPCB pcbName
PCB 名を指定できるオプション。PSB レコードで定義するのと同じように、デフォルトの PCB 名の代わりに使用します。
with #dli{ dliStatement }
#dli ディレクティブ』で説明されているように、明示的 DL/I GN 文または GHN 文を許可するオプション。 #dli と左中括弧の間にスペースを入れないでください。
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 処理』を参照してください。

DLISegment レコード

get next 文は DL/I GN 文を生成します。get next...forUpdate 文は DL/I GHN 文を生成します。get next 文の基本の使用目的は次のとおりです。
  • あるセグメントのデータに何かを行うため、例えばレポートや請求書の印刷をするためにそのセグメントを読み込む。
  • EGL キーワード、delete または replace を使ってセグメントを除去したり更新したりするために、(forUpdate オプションと組み合わせて) セグメントを保持する。 レコードを 追加 する前に get next を実行する必要はありません。レコードは順番に、またはそのレコードのキー項目の値に従って追加されるからです。

索引付きレコード

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 以外の正常な入出力文は、新しいファイル位置を設定し、同じ 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 文が別々のプログラムにあり、一方のプログラムで他方のプログラムが呼び出される場合にも起こります。同様に、get 文または get next 文に続く add 文は、ファイルの先頭にレコードを追加します。
複数のプログラムで同時に同じファイルが開かないようにしておくことをお勧めします。

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

IMS/VS では、次の考慮事項が適用されます。
  • シリアル・レコードは I/O PCB (PCB 0) と関連づけられる必要がある。get next 文は、トランザクション・プログラムやトランザクション・プログラムから呼び出されるバッチ・プログラムについてはサポートされていません。 バッチ・プログラムでは入力にただ 1 つのシリアル・ファイルしか使えません。 IMS™ のメッセージ・ヘッダー (長さ、ZZ フィールド、およびトランザクション・コード) は、キューから読み込まれた各レコードから自動的に除去されます。
  • 単一セグメントのメッセージ・キューに割り当てられたシリアル・レコードに対する get next 文の結果、I/O PCB への get unique (GU) 呼び出しが行われます。この GU 呼び出しにより、自動コミット点が決まります。
  • 複数セグメントのメッセージ・キューに割り当てられたシリアル・レコードに対する最初の get next 文の結果、I/O PCB への GU 呼び出しが行われます。 後続の get next 文により、NRF (状況コード QD) 条件に到達するまで GN 呼び出しが行われます。NRF に到達してからの最初の get next 文 により、別の GU 呼び出しが行われ、この関数は EOF (状況コード QC) に到達するまで継続します。各 GU 呼び出しにより、自動コミット点が決まります。
  • バッチ・プログラムの特定のスケジューリング中、プログラムは 1 つのメッセージ・キューからしか get next 文を実行できません。 IMS がプログラムをスケジュールに入れたトランザクション・コードが、読み取られるメッセージ・キューを決定します。生成中に指定されるシステム・リソースは無視されます。
IMS トランザクション指向の BMP の場合、メッセージ・キューに割り当てられたシリアル・レコードに対する get next 文には、IMS/VS における場と同じ考慮事項が含まれます。

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.