2015年11月10日火曜日

PLSQL 制御文 ~LOOP文~

PLSQLの繰り返し処理には次のようなものがあります。
  • FOR LOOP
  • WHILE LOOP(前判定ループ)
  • LOOP(後判定ループ)

FOR LOOP


決められた回数ループ処理を行います。
FOR カウンタ変数 IN 初期値..最大値 LOOP
    繰り返し処理;
END LOOP;

1~9までの値を出力します。
DECLARE
BEGIN    
    FOR counter IN 1..9 LOOP
        SYS.DBMS_OUTPUT.PUT_LINE(counter);
    END LOOP;
END;

REVERSEを指定すると最大値から最小値までの値を出力します。
FOR カウンタ変数 IN REVERSE 初期値..最大値 LOOP
    繰り返し処理;
END LOOP;

9~1までの値を出力します。
DECLARE
BEGIN    
    FOR counter IN REVERSE 1..9 LOOP
        SYS.DBMS_OUTPUT.PUT_LINE(counter);
    END LOOP;
END;

初期値、最大値は変数を指定することも可能です。
DECLARE
    first NUMBER;
    last NUMBER;
BEGIN    

    first := 1;
    last := 9;
    FOR counter IN first..last LOOP
        SYS.DBMS_OUTPUT.PUT_LINE(counter);
    END LOOP;
END;

WHILE LOOP(前判定ループ)


WHILE LOOP文は、条件に一致する間ループ処理を実行します。
条件に一致しなければ、ループ処理が1回も実行されないことがあります。
WHILE 条件 LOOP
  条件に一致する間、繰り返す処理;
END LOOP;

counter変数が10以下の場合にみ、ループ処理を実行します。
DECLARE
    counter NUMBER(2);
BEGIN

    counter := 0;
    WHIlE counter < 10 LOOP
        SYS.DBMS_OUTPUT.PUT_LINE(counter);
        counter := counter + 1;
    END LOOP;
  
END;

LOOP(後判定ループ) と EXIT文、EXIT WHEN文


このループ処理は終了条件を書かないと無限ループになります。
LOOP
    繰り返す処理;
END;
ループ終了条件はEXIT文またはEXIT WHEN文で指定します。

EXIT文はループ処理を無条件で終了します。
EXIT WHEN文はWHEN句の条件に一致するとループ処理を終了します。

1~9を出力します。
EXIT文を利用して、counter変数が10になたらループ処理を終了します。
DECLARE
    counter NUMBER;
BEGIN    

    counter := 1;
    LOOP       
        SYS.DBMS_OUTPUT.PUT_LINE(counter);
        counter := counter + 1;
        IF ( counter = 10) THEN
            EXIT;
        END IF;
    END LOOP;
END;

1~9を出力します。
EXIT WHEN文を利用して、counter変数が10になたらループ処理を終了します。
DECLARE
    counter NUMBER;
BEGIN    

    counter := 1;
    LOOP       
        SYS.DBMS_OUTPUT.PUT_LINE(counter);       
        counter := counter + 1;
        
        EXIT WHEN counter = 10;
    END LOOP;
END;


EXIT文、EXIT WHEN文は、LOOP文だけでなくWHILE LOOP文やFOR LOOP文でも使用できます。


CONTINUE文


11g以降はCONTINUE、CONTINUE WHENにより現行のループをスキップできます。

CONTINUE文を使用して、カウンター変数が偶数の場合はループ処理をスキップします。
DECLARE
  
BEGIN    

    FOR counter IN 1..9 LOOP       
        IF ( counter MOD 2 = 0 ) THEN
            CONTINUE;
        END IF;     
        --出力:1 3 5 7 9
        SYS.DBMS_OUTPUT.PUT_LINE(counter);
    END LOOP;
END;

CONTINUE WHEN文を使用して、カウンター変数が偶数の場合はループ処理をスキップします。

DECLARE
  
BEGIN    

    FOR counter IN 1..9 LOOP       
        CONTINUE WHEN counter MOD 2 = 0;
        --出力:1 3 5 7 9
        SYS.DBMS_OUTPUT.PUT_LINE(counter);
    END LOOP;
END;
11g以前でCONTINUEと同様の処理を行うには、ラベルを使用した方法があります。
またループをネストした多重ループで、スキップしたいループや終了したいループを指定するときにもラベルが使用できます。
詳しくはコチラ「PLSQL 制御文 ~GOTO文とラベル、NULL文~

0 件のコメント: