GOTO ステートメント

GOTO ステートメントは、SQL 関数、SQL プロシージャー、または SQL トリガー内部の ユーザー定義のラベルに分岐します。

構文

構文図を読む構文図をスキップする
>>-+---------+--GOTO--label2-----------------------------------><
   '-label1:-'                 

説明

ラベル 1
GOTO ステートメントのラベルを指定します。 このラベル名は、ルーチン名または同じ有効範囲内の別のラベルと同じものにすることはできません。 詳しくは、SQL ラベルの参照を参照してください。
label2
処理を継続するラベル付きステートメントを指定します。 ラベル付きステートメントと GOTO ステートメントは、両方とも同じ有効範囲内 に存在しなければなりません。
  • FOR ステートメントの中で GOTO ステートメントを定義する場合は、同じ FOR ステートメントの中で label2 を定義する必要があります (ただし、ネストされた FOR ステートメントまたはネストされた複合ステートメントは除きます)。
  • FOR ステートメントの外で GOTO ステートメントを定義する場合は、FOR ステートメントまたはネストされた複合ステートメントの中で label2 を定義しないでください。
  • 異常事態処理ルーチンの中で GOTO ステートメントを定義する場合は、同じ処理ルーチンの中で label2 を定義する必要があります。
  • 異常事態処理ルーチンの外で GOTO ステートメントを定義する場合は、異常事態処理ルーチンの中で label2 を定義しないでください。

ラベル 2 が GOTO ステートメントで到達可能 な有効範囲内に定義されていない場合は、エラーが戻されます。

GOTO ステートメントの使用: GOTO ステートメントは、控えめに使用することをお勧めします。このステートメントは、SQL ステートメントの通常の処理順序を乱すので、ルーチンの読み取りや維持が難しくなります。GOTO ステートメントを使用する前に、IF ステートメントや LEAVE ステートメントなど別のステートメントを代わりに使用することで、GOTO ステートメントを使わずに済まないか検討してください。

オープン・カーソルに対する影響: GOTO ステートメントが制御を複合ステートメントから移動すると、その GOTO ステートメントを含んでいる該当の複合ステートメントで宣言されているすべてのオープン・カーソルはクローズされます。ただし、結果セットを戻すように宣言される場合、または *ENDACTGRP が指定されている場合を除きます。

ATOMIC 複合ステートメントに対する影響: GOTO ステートメントが制御を ATOMIC 複合ステートメントから移動すると、その ATOMIC 複合ステートメントが入力されたときに暗黙的に開始されたセーブポイントが解放されます。

SQLSTATE および SQLCODE 変数に関する考慮事項: GOTO ステートメントは、SQLSTATE および SQLCODE SQL 変数に影響を与えません。 GOTO ステートメントの終わりで、SQLSTATE および SQLCODE SQL 変数は、その GOTO ステートメントの前に実行された最後のステートメントの結果を反映します。

次のステートメントでは、パラメーター ratingv_empno がプロシージャーに渡されます。サービスの時間が、出力パラメーター return_parm で日付期間として戻されます。会社のサービスの時間が 6 カ月未満の場合、GOTO ステートメント は制御をプロシージャーの最後に移動し、new_salary は変更されないままになります。

CREATE PROCEDURE adjust_salary
  (IN v_empno CHAR(6),
   IN rating INTEGER,
   OUT return_parm DECIMAL(8,2))
  LANGUAGE SQL
  MODIFIES SQL DATA 
    BEGIN
       DECLARE new_salary DECIMAL(9,2);
       DECLARE service DECIMAL(8,2);
            SELECT salary, CURRENT_DATE - hiredate
               INTO new_salary, service
               FROM employee
               WHERE empno = v_empno;
            IF service < 600
              THEN GOTO exit1;
            END IF;
            IF rating = 1
             THEN SET new_salary = new_salary + (new_salary * .10);
             ELSEIF rating = 2
             THEN SET new_salary = new_salary + (new_salary * .05);
            END IF;
            UPDATE employee
               SET salary = new_salary
               WHERE empno = v_empno;

       EXIT1: SET return_parm = service;
     END