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プロシージャが正常に完了しました。


日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)