【PL/SQL】FOR、LOOP、WHILE:繰り返し処理の制御


ここではORACLE社が提供するPL/SQL言語でFOR、LOOP、WHILEで繰り返し処理を制御する方法を紹介しています。

FOR、LOOP、WHILE:繰り返し処理の制御

FOR文

FOR文を使うことで、任意の回数分、処理を繰り返し実行することが出来ます。

このときカウンタ変数というループ内で有効な変数を宣言します。カウンタ変数は、1回のループの処理ごとに+1されていき、これが初期値から終了値になるまで処理を繰り返します。

FOR カウンタ変数 IN 初期値..終了値 LOOP
    処理
END LOOP;

次の例では、カウンタ変数iを宣言し、1から3になるまでの間、処理を実行しています。

BEGIN
    FOR i IN 1..3 LOOP
        DBMS_OUTPUT.PUT_LINE(i);
    END LOOP;
END;
1
2
3
PL/SQLが実行されました(143 msec.)

FOR文(逆順)

FOR文はREVERSE句を使うことで逆順で繰り返し処理を実行することが出来ます。

逆順とは、カウンタ変数が終了値から開始し、1回のループで-1されていき、初期値になるまで繰り返します。

FOR カウンタ変数 IN REVERSE 初期値..終了値 LOOP
    処理
END LOOP;
BEGIN
    FOR i IN REVERSE 1..3 LOOP
        DBMS_OUTPUT.PUT_LINE(i);
    END LOOP;
END;

LOOP文

LOOP文を使うことで繰り返し処理を書くことが出来ます。

LOOP処理は終了条件を記述しなければ、無限ループになるので注意が必要です。

LOOP
    処理
    [ 条件 ]
END LOOP;

次の例では、iという変数をカウンタ変数として使い、1行処理されるごとに+1しています。

iが2になるまでループするように「IF i = 2 THEN」で条件分岐させ、EXIT文でLOOP処理を終了しています。

DECLARE
    i NUMBER := 0;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE(i);
        i := i + 1;
        IF i = 2 THEN
            EXIT;
        END IF;
    END LOOP;
END;
0
1
PL/SQLが実行されました(47 msec.)

WHILE文

WHILE文では条件に終了条件を書き繰り返し処理を実行します。

終了条件とは言い換えるとループを継続する条件とも言えます。例えば「i<2」と書けば、iが2より小さい間ループを繰り返し実行する、ということになります。

WHILE 条件 LOOP
    処理
END LOOP;

次の例では、カウンタ変数として宣言したiが2より小さい間、ループ処理を継続しています。

iが2以上になったときにループを終了しています。

DECLARE
    i NUMBER := 0;
BEGIN
    WHILE i < 2 LOOP
        DBMS_OUTPUT.PUT_LINE(i);
        i := i + 1;
    END LOOP;
END;
0
1
PL/SQLが実行されました(7 msec.)

EXIT文

EXIT文を書くことでループ処理を終了することが出来ます。

LOOP処理で紹介したように、次のように終了条件を満たす場合にEXIT文を実行することでループ処理を終了することが出来ます。

DECLARE
    i NUMBER := 0;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE(i);
        i := i + 1;
        IF i = 2 THEN
            EXIT;
        END IF;
    END LOOP;
END;
0
1

また、「EXIT WHEN文」と書くことで、条件とEXIT処理を1行で記述することもできます。

DECLARE
    i NUMBER := 0;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE(i);
        i := i + 1;
        EXIT WHEN i = 2;
    END LOOP;
END;
0
1
PL/SQLが実行されました(6 msec.)

CONTINUE文

CONTINUE文を使うことでループ処理をスキップすることが出来ます。

次の例では、カウンタ変数iが3のときだけループ処理を飛ばしています。

BEGIN
    FOR i IN 1..5 LOOP
        IF i = 3 THEN 
            CONTINUE;
        END IF;
        DBMS_OUTPUT.PUT_LINE(i);
    END LOOP;
END;
1
2
4
5
PL/SQLが実行されました(23 msec.)

また、「CONTINUE WHEN文」と書くことで、条件とEXIT処理を1行で記述することもできます。

BEGIN
    FOR i IN 1..5 LOOP
        CONTINUE WHEN i = 3;
        DBMS_OUTPUT.PUT_LINE(i);
    END LOOP;
END;
1
2
4
5
PL/SQLが実行されました(22 msec.)