forEach

EGL キーワード forEach は、ループで実行される一連の文の始まりを示します。最初の反復が発生するのは、指定された結果セットが使用可能である場合だけです。 (その結果セットが使用可能でない場合、この文はハード・エラーで失敗します。) ループでは、以下のいずれかのイベントが発生するまで、結果セット内の各行の読み取りが続行されます。

forEach の構文図
sqlRecord
直前に実行された open ステートメントで使用された SQL レコードの名前。 SQL レコードまたは結果セット ID を指定する必要があり、結果セット ID を指定することが推奨されます。
from resultSetID
直前に実行された open 文で使用された結果セット ID。 詳細については、『resultSetID』を参照してください。
into ... item
カーソルまたはストアード・プロシージャーから値を受け取る EGL ホスト変数を識別する INTO 文節です。 #sql{ } ブロックの外側にある、このような文節では、ホスト変数名の前にセミコロンを含めないでください。

このコンテキストで INTO 文節を指定すると、関連する open 文で示されている INTO 文節はオーバーライドされます。

statement
EGL 言語の文

ほとんどの場合、EGL ランタイムは forEach 文の最後の反復の後に実行される close 文を暗黙に発行します。その暗黙のステートメントは、SQL システム変数を変更します。その理由は、ユーザーが SQL 関連システム変数の値を forEach ステートメントの本体内に保管したい場合があるからです。

EGL ランタイムは、forEach 文が noRecordFound 以外のエラーのために終了した場合には、暗黙の close 文を発行しません。

以下に例を示します。詳細については、『SQL 例』を参照してください。
  VGVar.handleHardIOErrors  = 1;

    try
    open selectEmp
      with #sql{
        select empnum, empname
        from employee
        where empnum >= :empnum
        for update of empname
      }
      into empnum, empname;
  onException
    myErrorHandler(6);    // プログラムを終了する
  end

    try
    forEach (from selectEmp)
      empname = empname + " " + "III";
    
        try
        execute
          #sql{
            update employee
            set empname = :empname
          where current of selectEmp
          };
      onException
        myErrorHandler(10); // プログラムを終了する
      end
    end  // end forEach 結果セットの最後の行が読み取られると
         // カーソルは自動的にクローズされる

  onException
    // 条件が "sqlcode = 100" の場合、forEach に関連した例外ブロックは実行されないので
    // "if (sqlcode != 100)" のテストは避ける。
    myErrorHandler(8);  // プログラムを終了する
  end

  sysLib.commit();

関連する概念
resultSetID
SQL サポート

関連するタスク
EGL ステートメントおよびコマンドの構文図

関連する参照項目
EGL ステートメント
exit
open
SQL 例

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