14.5 基本LOOP文
基本LOOP
文が反復されるたびに、文が実行され、制御がループの先頭に戻ります。ループの内側の文によって制御がループの外側に移された場合や例外が呼び出された場合に、LOOP
文は終了します。
ここでのトピック
構文
セマンティクス
basic_loop_statement
statement
無限ループが発生しないように、1つ以上の文によって制御をループの外側に移す必要があります。制御をループの外側に移すことができる文には次のものがあります。
-
「CONTINUE文」(外側のラベル付きループの次の反復に制御を移す場合)
label
basic_loop_statement
を識別するラベル(「statement ::=」および「label」を参照)。CONTINUE
、EXIT
およびGOTO
文でこのラベルを参照できます。
LOOP
文がネストされている場合は特に、ラベルによって読みやすさが向上します。ただし、END
LOOP
文内のラベルが、同じLOOP
文の先頭のラベルと一致している場合のみです(コンパイラではチェックしません)。
例
例14-9 EXIT WHEN文が含まれているネストされたラベル付き基本LOOP文
この例では、基本LOOP
文が別の基本LOOP文にネストされていて、両方にラベルが付けられています。内部ループにはEXIT
WHEN
文が2つあり、1つは内部ループを終了し、もう1つは外部ループを終了します。
DECLARE s PLS_INTEGER := 0; i PLS_INTEGER := 0; j PLS_INTEGER; BEGIN <<outer_loop>> LOOP i := i + 1; j := 0; <<inner_loop>> LOOP j := j + 1; s := s + i * j; -- Sum several products EXIT inner_loop WHEN (j > 5); EXIT outer_loop WHEN ((i * j) > 15); END LOOP inner_loop; END LOOP outer_loop; DBMS_OUTPUT.PUT_LINE ('The sum of products equals: ' || TO_CHAR(s)); END; /
結果:
The sum of products equals: 166
例14-10 EXIT WHEN文が含まれているネストされたラベルなしの基本LOOP文
内部ループ内のEXIT
WHEN
文から外部ループに制御を移すことができるのは、外部ループにラベルが付けられている場合のみです。
この例では、外部ループにはラベルが付いていないため、内部ループは制御を外部ループに移すことができません。
DECLARE i PLS_INTEGER := 0; j PLS_INTEGER := 0; BEGIN LOOP i := i + 1; DBMS_OUTPUT.PUT_LINE ('i = ' || i); LOOP j := j + 1; DBMS_OUTPUT.PUT_LINE ('j = ' || j); EXIT WHEN (j > 3); END LOOP; DBMS_OUTPUT.PUT_LINE ('Exited inner loop'); EXIT WHEN (i > 2); END LOOP; DBMS_OUTPUT.PUT_LINE ('Exited outer loop'); END; /
結果:
i = 1 j = 1 j = 2 j = 3 j = 4 Exited inner loop i = 2 j = 5 Exited inner loop i = 3 j = 6 Exited inner loop Exited outer loop PL/SQL procedure successfully completed.