Plsql-goto-statement

提供:Dev Guides
移動先:案内検索

PL/SQL-GOTOステートメント

PL/SQLプログラミング言語の GOTO ステートメントは、GOTOから同じサブプログラム内のラベル付きステートメントへの無条件ジャンプを提供します。

-GOTOステートメントの使用は、プログラムの制御フローをトレースすることを難しくし、プログラムを理解しにくく、変更しにくくするため、どのプログラミング言語でも推奨されません。 GOTOを使用するプログラムは、GOTOを必要としないように書き換えることができます。

構文

PL/SQLのGOTO文の構文は次のとおりです-

GOTO label;
..
..
<< label >>
statement;

流れ図

PL/SQL gotoステートメント

DECLARE
   a number(2) := 10;
BEGIN
   <<loopstart>>
   -- while loop execution
   WHILE a < 20 LOOP
   dbms_output.put_line ('value of a: ' || a);
      a := a + 1;
      IF a = 15 THEN
         a := a + 1;
         GOTO loopstart;
      END IF;
   END LOOP;
END;
/

上記のコードがSQLプロンプトで実行されると、次の結果が生成されます-

value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 16
value of a: 17
value of a: 18
value of a: 19

PL/SQL procedure successfully completed.

GOTOステートメントの制限

PL/SQLのGOTOステートメントは、次の制限を課します-

  • GOTOステートメントは、IFステートメント、CASEステートメント、LOOPステートメント、またはサブブロックに分岐できません。
  • GOTOステートメントは、IFステートメントの句から別の句に、またはCASE文のWHEN句から別の句に分岐できません。
  • GOTOステートメントは、外側のブロックからサブブロック(つまり、内側のBEGIN-ENDブロック)に分岐できません。
  • GOTOステートメントは、サブプログラムから分岐できません。 サブプログラムを早期に終了するには、RETURNステートメントを使用するか、GOTOをサブプログラムの終了直前の場所に分岐させます。
  • GOTOステートメントは、例外ハンドラーから現在のBEGIN-ENDブロックに戻ることはできません。 ただし、GOTOステートメントは、例外ハンドラーから外側のブロックに分岐できます。