14.33 FOR LOOP文

FOR LOOP文が反復されるたびに、文が実行され、索引が増分または減分され、制御がループの先頭に戻ります。

指定された値に索引が達した場合、ループの内側の文によって制御がループの外側に移された場合、または例外が呼び出された場合は、FOR LOOP文が終了します。索引はイテランドと呼ばれることもあります。ループの外側の文は、イテランドを参照できません。FOR LOOP文の実行後、イテランドは未定義になります。

ここでのトピック

構文

セマンティクス

for_loop_statement

イテレータ

イテレータ」を参照してください

statement

EXITEXIT WHENCONTINUEまたはCONTINUE WHENstatements内に置くと、ループまたは現行のループの反復を途中で終了させることができます。すべての使用可能な文のリストについては、statement ::=を参照してください

label

for_loop_statementを識別するラベル(ラベルを参照)。CONTINUEEXITおよびGOTO文でこのラベルを参照できます。

LOOP文がネストされている場合は特に、ラベルによって読みやすさが向上します。ただし、END LOOP文内のラベルが、同じLOOP文の先頭のラベルと一致している場合のみです(コンパイラではチェックしません)。

  • 例5-19 「FOR LOOPのステップ範囲イテレータを使用した単純なステップ・フィルタ」
  • 例5-15 「FOR LOOP文の範囲繰返しコントロール」
  • 例5-16 「反転FOR LOOP文の範囲繰返しコントロール」
  • 例5-27 「FOR LOOP停止述語句の使用」
  • 例5-28 「FOR LOOPスキップ述語句の使用」
  • 例5-10外側の文によるFOR LOOP文の索引の参照

  • 例5-11変数と同じ名前を持つFOR LOOP文の索引

  • 例5-12FOR LOOP文による索引と同じ名前を持つ変数の参照

  • 例5-13同じ索引名のネストしたFOR LOOP文

例14-33 FOR LOOP文内のEXIT WHEN文

特定の条件が発生した場合はただちにFOR LOOP文を終了する必要があるとします。FOR LOOP文内のEXIT WHEN文に、条件を指定できます。

この例では、FOR LOOP文が10回実行されますが、内側のFETCH文から行が戻されなくなった場合は、ただちにループが終了します。

DECLARE
  v_employees employees%ROWTYPE;
  CURSOR c1 is SELECT * FROM employees;
BEGIN
  OPEN c1;
  -- Fetch entire row into v_employees record:
  FOR i IN 1..10 LOOP
    FETCH c1 INTO v_employees;
    EXIT WHEN c1%NOTFOUND;
    -- Process data here
  END LOOP;
  CLOSE c1;
END;
/

例14-34 内側のFOR LOOP文内のEXIT WHEN文

次は、途中で終了する必要のあるFOR LOOP文が、別のFOR LOOPの中にネストされているとします。内側のループを途中で終了したときに外側のループも終了する必要がある場合は、外側のループにラベルを付けて、そのラベル名をEXIT WHEN文で指定します。

DECLARE
  v_employees employees%ROWTYPE;
  CURSOR c1 is SELECT * FROM employees;
BEGIN
  OPEN c1;
  
  -- Fetch entire row into v_employees record:
  <<outer_loop>>
  FOR i IN 1..10 LOOP
    -- Process data here
    FOR j IN 1..10 LOOP
      FETCH c1 INTO v_employees;
      EXIT outer_loop WHEN c1%NOTFOUND;
      -- Process data here
    END LOOP;
  END LOOP outer_loop;
 
  CLOSE c1;
END;
/

例14-35 内側のFOR LOOP文内のCONTINUE WHEN文

内側のループを途中で終了したときに外側の現行のループは反復を完了する必要がある場合は、外側のループにラベルを付けて、そのラベル名をCONTINUE WHEN文で指定します。

DECLARE
  v_employees employees%ROWTYPE;
  CURSOR c1 is SELECT * FROM employees;
BEGIN
  OPEN c1;
  
  -- Fetch entire row into v_employees record:
  <<outer_loop>>
  FOR i IN 1..10 LOOP
    -- Process data here
    FOR j IN 1..10 LOOP
      FETCH c1 INTO v_employees;
      CONTINUE outer_loop WHEN c1%NOTFOUND;
      -- Process data here
    END LOOP;
  END LOOP outer_loop;
 
  CLOSE c1;
END;
/

関連トピック