PL/SQL の順次制御 : GOTO 文、NULL 文、そして ラベル
プログラミングの制御構造には、「選択」、「反復」、「順次」と3つの基本的な制御構造がある。
PL/SQL における 「順次制御構造」 は、GOTO 文 と NULL 文 である。
「選択」 ⇒ IF 文 および CASE 文
「反復」 ⇒ FOR、WHILE、LOOP
NULL 文
NULL 文とは 何もしない(NOP)ステートメントである。
例えば、スタブとして空のプロシージャを用意したり、IF 文 の条件分岐を見やすくするために用いたりする。例外処理 として呼び出し元には例外を通知したくないが、プログラム内でも「何もすることがない」というときにも使用することが多い。
また、多重ループを抜け出す 場合にもラベルを使用する。(個人的にあまり使わないように努力する)
ちなみに「NULL 文」 と 「NULL 値」は無関係。
GOTO 文 と ラベル <<label_name>>
GOTO 文を使用するには GOTO 先として ラベルの定義が必要となる。
ラベルとは、HTML で置き換えれば、ある「ステートメント」に付けたアンカーのようなもの。
- ラベルは '<<' と '>>' で囲んで 識別子 として有効な任意のラベル名を設定する
- ラベルはステートメントに対して設定される (ラベルは単独で存在できない)
- ラベルにステートメントが設定できない場合には NULL 文 をラベルのステートメントとして使用する
GOTO 文 による ラベル 'noprint' へのジャンプ
SQL> set serveroutput on
SQL> begin
2 GOTO noprint;
3
4 dbms_output.put_line('GOTO 文により実行されません');
5
6 <<noprint>>
7 dbms_output.put_line('ラベル付けされたステートメントです。');
8 end;
9 /
ラベル付けされたステートメントです。
NULL 文 に ラベル 'abend' を付ける例 (END にはラベルは付けられない)
SQL> begin
2 GOTO abend;
3
4 dbms_output.put_line('GOTO 文により実行されません');
5
6 <<abend>>
7 NULL;
8 end;
9 /
PL/SQLプロシージャが正常に完了しました。
END にはラベルを付けられないが ブロックの先頭(DECLARE または BEGIN の直前)にはラベルを設定できる。
ラベルを使って二重ループ(多重ループ)を抜け出すための豆知識
ラベル <<OUTER_LOOP>> と EXIT 'ラベル名' WHEN 文により外部ループを抜け出す。
SQL> begin
2 <<OUTER_LOOP>>
3 for i in 1..10 loop
4 for j in 1..10 loop
5 EXIT OUTER_LOOP WHEN (i=1);
6 dbms_output.put_line('EXIT WHEN 文により1回も実行されません');
7 end loop;
8 end loop;
9 end;
10 /
PL/SQLプロシージャが正常に完了しました。