14.5 基本LOOP文

基本LOOP文が反復されるたびに、文が実行され、制御がループの先頭に戻ります。ループの内側の文によって制御がループの外側に移された場合や例外が呼び出された場合に、LOOP文は終了します。

ここでのトピック

構文

セマンティクス

basic_loop_statement

statement

無限ループが発生しないように、1つ以上の文によって制御をループの外側に移す必要があります。制御をループの外側に移すことができる文には次のものがあります。

label

basic_loop_statementを識別するラベル(「statement ::=」および「label」を参照)。CONTINUEEXITおよび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.