14.33 FOR LOOP文
FOR
LOOP
文が反復されるたびに、文が実行され、索引が増分または減分され、制御がループの先頭に戻ります。
FOR
LOOP
文が終了します。索引はイテランドと呼ばれることもあります。ループの外側の文は、イテランドを参照できません。FOR LOOP
文の実行後、イテランドは未定義になります。
ここでのトピック
構文
セマンティクス
for_loop_statement
イテレータ
「イテレータ」を参照してください
statement
EXIT
、EXIT
WHEN
、CONTINUE
またはCONTINUE
WHEN
をstatements
内に置くと、ループまたは現行のループの反復を途中で終了させることができます。すべての使用可能な文のリストについては、「statement ::=」を参照してください
label
for_loop_statement
を識別するラベル(「ラベル」を参照)。CONTINUE
、EXIT
およびGOTO
文でこのラベルを参照できます。
LOOP
文がネストされている場合は特に、ラベルによって読みやすさが向上します。ただし、END
LOOP
文内のラベルが、同じ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; /
関連トピック
-
概念の詳細は、「FOR LOOP文の概要」を参照してください
-
例外の詳細は、「例外処理の概要」を参照してください。特定の条件が発生した場合は、例外を使用してただちにループを終了させることもできます