ここでは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.)