しかし、他の言語同様に多用するのは厳禁です。
11g以前ではループのスキップにcontinue文が使用できないので、GOTO文を使用する機会があるかと思います。
GOTO文とラベル、NULL文の基本的な使い方
まずはGOTO文とラベルの使い方です。
ラベルは「「<<ラベル名>>」と定義します。
GOTO文で「GOTO ラベル名;」とすることで、指定したラベルに制御を移すことができます。
処理がないラベルを定義する事はできません。
ラベルの処理が何もない場合はNULL文を使用します。 NULL文は何もしないステートメントを意味します。
DECLARE num NUMBER := &任意の数値; BEGIN IF (num < 10) THEN GOTO under_ten; ELSE GOTO over_ten; END IF; <<under_ten>> SYS.DBMS_OUTPUT.PUT_LINE('10以下'); <<over_ten>> NULL; END;
ループのContinue文の代わりにGOTO文を使用する(11g以前)
11g以前ではContinue文が使用できないので、ループのスキップにGOTO文を使用することがあります。
※11g以降はcontinue文を使用したほうがよいと思います。
Continue文についてはコチラ 「PLSQL 制御文 ~LOOP文~」
以下はGOTO文を使用した、ループのスキップです。
ループカウンタが偶数の場合は、ループ処理をスキップします。
DECLARE BEGIN FOR num IN 1..10 LOOP IF (num Mod 2 = 0) THEN GOTO continue; END IF; SYS.DBMS_OUTPUT.PUT_LINE(num); <<continue>> NULL; END LOOP; END;
ループラベル
ループ開始の直前にラベルを付けるとそのラベルは「ループラベル」になります。
11g以降ではContinue文が使用できますが、「Continue ラベル;」や「Continue ラベル WHEN 条件;」と書くことで、スキップするループを指定することができます。
同様にEXIT文についても「Exit ラベル;」や「Exit ラベル WHEN 条件;」と書くことで、終了するループを指定することができます。
ループをネストした多重ループで、スキップしたいループや終了したいループを指定するときに使用します。
DECLARE BEGIN <<loop_1>> FOR i IN 1..3 LOOP <<loop_2>> FOR j IN 1..3 LOOP <<loop_3>> FOR k iN 1..3 LOOP dbms_output.put_line('i=' || i || ', j=' || j || ', k=' || k ); --j=2はループ2をスキップ CONTINUE loop_2 WHEN ( j = 2); --j=3はループ1をスキップ IF (j = 3) THEN CONTINUE loop_1; END IF; --i=2はループ3を終了 EXIT loop_3 WHEN ( i = 3); --i=3はループ2を終了 IF (i = 3) THEN EXIT loop_2; END IF; END LOOP; --loop1 END LOOP; --loop2 END LOOP; --loop3 dbms_output.put_line('ループ終了'); END;出力結果
i=1, j=1, k=1
i=1, j=1, k=2
i=1, j=1, k=3
i=1, j=2, k=1
i=1, j=3, k=1
i=2, j=1, k=1
i=2, j=1, k=2
i=2, j=1, k=3
i=2, j=2, k=1
i=2, j=3, k=1
i=3, j=1, k=1
i=3, j=2, k=1
i=3, j=3, k=1
ループ終了
0 件のコメント:
コメントを投稿