ITERATE ステートメント

ITERATE ステートメントは、制御のフローをラベル付きループの先頭に戻します。

構文

構文図を読む構文図をスキップする
>>-+--------+--ITERATE--target-label---------------------------><
   '-label:-'                          

説明

label
ITERATE ステートメントのラベルを指定します。 このラベル名は、ルーチン名または同じ有効範囲内の別のラベルと同じものにすることはできません。 詳しくは、SQL ラベルの参照を参照してください。
target-label
制御のフローを渡す FOR、LOOP、REPEAT、または WHILE のいずれかのステートメントのラベルを指定します。target-label は、FOR、LOOP、REPEAT、または WHILE ステートメントのラベルとして定義する必要があります。ITERATE ステートメントはその FOR、LOOP、REPEAT、または WHILE ステートメントの中、またはそのいずれかのステートメント内に直接または間接的にネストされたコードのブロック内になければならず、以下の制限の対象となります。
  • ITERATE ステートメントが条件ハンドラー内にある場合、target-label はその条件ハンドラー内で定義する必要があります。
  • ITERATE ステートメントが条件ハンドラー内にない場合、target-label を条件ハンドラー内で定義してはなりません。
  • ITERATE ステートメントが FOR ステートメント内にある場合、target-label はその FOR ステートメント上の該当するラベルでなければなりません。あるいはそのラベルをこの FOR ステートメントの中で定義する必要があります。

SQLSTATE および SQLCODE 変数に関する考慮事項: ITERATE ステートメントは SQLSTATE および SQLCODE SQL 変数には影響しません。SQLSTATE および SQLCODE SQL 変数は、ITERATE ステートメントの終了時に、その ITERATE ステートメントの前に、最後に実行されたステートメントの結果を反映します。

この例では、カーソルを使用して、新規部門に関する情報を戻します。 not_found 条件ハンドラーが呼び出されると、制御のフローがループの外側に渡されます。 v_dept の値が 'D11' の場合は、ITERATE ステートメントは 制御のフローを LOOP ステートメントの先頭に戻します。 それ以外の場合は、新規の行が DEPARTMENT 表に挿入されます。

    CREATE PROCEDURE ITERATOR ()
       LANGUAGE SQL
       MODIFIES SQL DATA
       BEGIN
          DECLARE v_dept CHAR(3);
          DECLARE v_deptname VARCHAR(29);
          DECLARE v_admdept CHAR(3);
          DECLARE at_end INTEGER DEFAULT 0;
          DECLARE not_found CONDITION FOR SQLSTATE '02000';
          DECLARE c1 CURSOR FOR
            SELECT deptno,deptname,admrdept
            FROM department
            ORDER BY deptno;
          DECLARE CONTINUE HANDLER FOR not_found
            SET at_end = 1;
          OPEN c1;
          ins_loop:
          LOOP
             FETCH c1 INTO v_dept, v_deptname, v_admdept;
             IF at_end = 1 THEN
                LEAVE ins_loop;
             ELSEIF v_dept ='D11' THEN
                ITERATE ins_loop;
             END IF;
             INSERT INTO department (deptno,deptname,admrdept)
                VALUES('NEW', v_deptname, v_admdept);
          END LOOP;
          CLOSE c1;
       END