16.20 - ITERATE - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQL ストアド プロシージャおよび埋め込みSQL

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1148-162K-JPN

目的

繰返しSQL文を終了し、ループ内の次の繰返し文を開始します。

呼び出し

実行可能な

ストアド プロシージャのみ。

構文

label_name
実行される繰返しのラベル名。

ANSI準拠

ITERATEは、ANSI/ISO SQL:2011に準拠しています。

許可

なし。

アクション

ITERATEは、参照される繰返し文に応じて、以下に示すアクションを実行します。

ITERATEが指定するラベル 結果
FOR文

カーソルに次の行が存在する場合には、FORループの次の文で実行が続行されます。

カーソルに次の行が存在しない場合には、カーソルが閉じて、FORループの対応するEND FOR終了子の外にある次の文で実行が続行されます。

LOOP文 LOOPブロックの内側にある最初の文は無条件で実行される。
REPEAT文 UNTIL句を評価しないでREPEATループ内の最初の文の実行に移る。
WHILE文

WHILE文の条件式がTUREに評価される場合、WHILEループ内の最初の文で実行が続行されます。

WHILE文の条件式がTRUEに評価されない場合には、ループの対応するEND WHILE終了子の外にある次の文で実行が続行されます。

ルール

  • ITERATEは独立した文ではありません。FOR、LOOP、REPEATまたはWHILE繰返し文と一緒にしか使用できません。
  • 文ラベルはITERATEキーワードの直後に続けるSYSUDTLIB
  • ITERATE文では、そのITERATEが組み込まれているBEGIN…END複合文に関連付けられているラベルを参照することはできません。
  • 文ラベルは、ITERATEが組み込まれている繰返し文に関連づけられているSYSUDTLIB
  • 入れ子のFORループの内側にITERATEを指定し、外側の繰返し文に関連づけられているラベルを参照する場合、外側の繰返し文内でオープンされているすべてのカーソルは、次の繰返しを実行する前にクローズされます。

例: ITERATEを使用したWHILE文の反復

次の例は、ITERATEを使用してWHILE文を繰り返す方法を示しています。

SELECT minNum INTO hminNum FROM limits
   WHERE LIMIT_TYPE = ’HIGHNUM’;
L1:
WHILE hCounter > 0 
DO
   INSERT INTO transaction (trans_num, account_num)
     VALUES (hCounter, hAccountNum);
   SET hCounter = hCounter - 1;
   IF hCounter >= hminNum THEN
      ITERATE L1;
   END IF;
   -- The following two statements perform only when
   -- hCounter < hminNum
   UPDATE limit SET minNum = hCounter;
   SET hminNum = hCounter;
END WHILE L1;

例: ITERATEを使用した外側のループの反復

次の例は、ITERATE文を使用して外側のループを繰り返す方法を示しています。

LOOP1:
WHILE hCounter > 0 
DO
   SELECT highNum INTO maxNum FROM limits
WHERE LIMIT_TYPE = 'HIGHNUM';
L1:
LOOP
      INSERT INTO transaction (trans_num,
      account_num) VALUES (hCounter, hAccountNum);
    SET hCounter = hCounter - 1;
    IF (hCounter = 10) THEN
      IF (hOnceIterated = 0) THEN
      SET hOnceIterated = 1);
        ITERATE LOOP L1;
      END IF;
    END IF;
    -- The following statement performs only if
    -- hCounter <> 10 or hOnceIterated <> 0
    SET hNum = hNum + 10;
   END LOOP L1;
   IF hCounter >= MaxNum THEN
      ITERATE LOOP1;
   END IF;
   -- The following statement performs only if
   -- hCounter < MaxNum.
      INSERT INTO transaction (trans_num,
      account_num) VALUES (hCounter, hAccountNum);
END WHILE LOOP1;
UPDATE transaction
  SET account_num = hAccountNum + 10;

例: ITERATEを使用した外側のFORループの反復

次の例は、ITERATEを使用して外側のFORループを繰り返す方法を示しています。取り出される行がなくなると、カーソルはクローズされ、制御はFORループの外側を繰り返します。

L1:
LOOP
   INSERT INTO transaction (trans_num, account_num)
     VALUES (hCounter, hAccountNum);
   SET hCounter = hCounter - 1;
   FOR RowPointer AS c_customer CURSOR FOR
      SELECT CustomerNumber AS Number
            ,CustomerName AS Name
            ,(Amount + 10000) a
        FROM customer
   DO
      SET hCustNum = RowPointer.Number;
      IF hCustNum >= 100 THEN
         ITERATE L1;
      END IF;
      -- The following statements perform only if
      -- hCustNum < 100; else the cursor closes before
      -- iterating outside the FOR loop block.
      SET hCustName = RowPointer.Name;
      SET hAmount = RowPointer.a +
                    RowPointer.a * 0.20;
      INSERT INTO Cust_temp VALUES (hCustNum,
            :hCustName);
       END FOR;
       SET hNum = hNum + 10;
    END LOOP L1;