SQL プロシージャーの LOOP ステートメント

LOOP ステートメントは、特殊なタイプのループ・ステートメントです。この理由は、終了条件の節がないためです。

これは、別の論理 (一般的には制御ステートメントの転送) によって、制御フローをループ外のいずれかの地点に強制的にジャンプさせるまで繰り返し実行される一連のステートメントを定義します。

LOOP ステートメントは一般的に、LEAVE、GOTO、ITERATE、または RETURN のうちのいずれかのステートメントと一緒に使用されます。 これらのステートメントは、ループの直後の地点、SQL プロシージャー内の指定のロケーション、ループの別の反復を開始するためのループの開始地点のいずれかに、強制的に制御を戻すことができますが、SQL プロシージャーを終了することもできます。 これらのステートメントの使用時にどこへフローを渡すかを指示するときは、ラベルを使用します。

LOOP ステートメントが便利なのは、ループ内に複雑な論理が配置されていて、複数の終了方法を必要とする場合ですが、無限ループ・インスタンスが起きないように慎重に使用する必要があります。

制御を移すステートメントのない LOOP ステートメントを単独で使用すると、そのループ内に含まれている一連のステートメントは無限に実行されることになります。 あるいは、制御フローを強制的に変更する条件ハンドラーが起動されることになるようなデータベース条件が発生するまで、または処理されない条件が発生したために SQL プロシージャーから強制的に戻ることになるまで、その一連のステートメントの実行が続けられます。

LOOP ステートメントを使用した SQL プロシージャーの例を以下に示します。 そこでは、ITERATE および LEAVE ステートメントも使用されています。

  CREATE  PROCEDURE ITERATOR()
  LANGUAGE SQL
  BEGIN
    DECLARE v_deptno CHAR(3); DECLARE v_deptname VARCHAR(29); 
    DECLARE at_end INTEGER DEFAULT 0;
    DECLARE not_found CONDITION FOR SQLSTATE '02000';

    DECLARE c1 CURSOR FOR SELECT deptno, deptname  
                          FROM department ORDER BY deptno;
    DECLARE CONTINUE HANDLER FOR not_found SET at_end = 1;
    OPEN c1;
  
    ins_loop: LOOP

      FETCH c1 INTO v_deptno, v_deptname; 

      IF at_end = 1 THEN
        LEAVE ins_loop;
      ELSEIF v_dept = 'D11' THEN
        ITERATE ins_loop;
      END  IF;

      INSERT  INTO department (deptno, deptname) 
        VALUES ('NEW', v_deptname);
    
    END LOOP;
  
    CLOSE c1;
  END