RESIGNAL ステートメント

RESIGNAL ステートメントは、ハンドラーがアクティブ化された条件を再通知するか、または条件をより高いレベルで処理できるように代替条件を発生させるために条件処理ルーチン内で使用されます。 このステートメントにより、オプションのメッセージ・テキストと共に返される例外、警告、または未検出条件が生成されます。

呼び出し

このステートメントは、コンパウンド SQL (コンパイル済み) ステートメント内の条件処理ルーチンに組み込む方法でのみ使用可能です。コンパウンド SQL (コンパイル済み) ステートメントは、SQL プロシージャー定義、SQL 関数定義、または SQL トリガー定義に組み込むことができます。

許可

モジュール条件が参照される場合、ステートメントの許可 ID が保持する特権に、モジュールに対する EXECUTE 特権が含まれている必要があります。

構文

構文図を読む構文図をスキップするRESIGNALSQLSTATEVALUEsqlstate-string-constantsqlstate-string-variablecondition-namesignal-information
signal-information
構文図を読む構文図をスキップするSETMESSAGE_TEXT =  SQL-variable-nameSQL-parameter-namediagnostic-string-constant

説明

SQLSTATE VALUE sqlstate-string-constant
指定されたストリング定数が SQLSTATE を表します。 この定数は、正確に 5 文字の文字ストリング定数でなければならず、 SQLSTATE の規則に従っていなければなりません。
  • 各文字は、数字 (0 から 9) またはアクセント記号のない大文字の英字 (A から Z) でなければなりません。
  • SQLSTATE クラス (最初の 2 文字) は "00" にはできません。これは正常な完了を示します。
SQLSTATE がこれらの規則に従っていない場合には、エラーになります (SQLSTATE 428B3)。
SQLSTATE VALUE
戻される SQLSTATE を指定します。有効な SQLSTATE 値をどれでも使用できます。指定値は、次のように、SQLSTATE の規則に従っていなければなりません。
  • 各文字は、数字 (0 から 9) または発音区別符号のない大文字の英字 (A から Z) でなければなりません。
  • SQLSTATE クラス (最初の 2 文字) は "00" にはできません。これは正常な完了を示します。
SQLSTATE がこれらの規則に従っていない場合、エラーが戻されます。
sqlstate-string-constant
sqlstate-string-constant は、正確に 5 文字の文字ストリング定数でなければなりません。
sqlstate-string-variable
指定する SQL 変数または SQL パラメーターは、データ・タイプ CHAR(5) でなければならず、NULL 値であってはなりません。
condition-name
戻される条件の名前を指定します。condition-name は、compound-statement 内で宣言されているか、または現行のサーバーに存在する条件を指定しなければなりません。
SET MESSAGE_TEXT =
エラーまたは警告を記述するストリングを指定します。 ストリングは SQLCA の sqlerrmc フィールドに返されます。 実際のストリングが 70 バイトを超えている場合は、警告なしで切り捨てられます。
SQL-variable-name
メッセージ・テキストを含む、コンパウンド・ステートメント内で宣言される SQL 変数を識別します。
SQL-parameter-name
メッセージ・テキストを含む、ルーチン用に定義される SQL パラメーターを識別します。SQL パラメーターは CHAR または VARCHAR データ・タイプとして定義されていなければなりません。
diagnostic-string-constant
メッセージ・テキストを含む文字ストリング定数を指定します。

  • SQLSTATE 節または condition-name を指定せずに RESIGNAL ステートメントを発行すると、 ハンドラーを呼び出したのと同じ条件が戻されます。 この条件と関連付けられた SQLSTATE、SQLCODE および SQLCA は変更されません。
  • 関連付けられた SQLSTATE 値のない condition-name を使用して RESIGNAL ステートメントが発行され、条件が処理されない場合は、SQLSTATE 45000 が戻され、SQLCODE が -438 に設定されます。この種の条件は、RESIGNAL ステートメントを発行するルーチンの有効範囲内の、SQLSTATE 45000 の条件処理ルーチンによって処理されないことに注意してください。
  • SQLSTATE 値を使用して、あるいは関連付けられた SQLSTATE 値のある condition-name を使用して RESIGNAL ステートメントが発行される場合、戻される SQLCODE は以下の SQLSTATE に基づいています。
    • 指定した SQLSTATE クラスが "01" か "02" のいずれかである場合、警告か、見つからないことを示す条件が戻され、SQLCODE は +438 に設定されます。
    • それ以外の場合、例外条件が戻され、SQLCODE は -438 に設定されます。
  • RESIGNAL ステートメントは、SQLCA の示されているフィールドを以下のように設定しています。
    • sqlerrd フィールドはゼロに設定されます
    • sqlwarn フィールドはブランクに設定されます
    • sqlerrmc は MESSAGE_TEXT の先頭の 70 バイトに設定されます
    • sqlerrmlsqlerrmc の長さか、 SET MESSAGE_TEXT 節が指定されていない場合にはゼロに設定されます
    • sqlerrp は ROUTINE に設定されます
  • SQLSTATE 値の詳細は、『SIGNAL ステートメント』の『注』を参照してください。

以下の例では、ゼロ除算によるエラーを検出します。 IF ステートメントは、 SIGNAL ステートメントを使用して overflow 条件処理ルーチンを呼び出します。 その条件処理ルーチンは、 RESIGNAL ステートメントを使用して別の SQLSTATE 値をクライアント・アプリケーションに戻します。

   CREATE PROCEDURE divide ( IN numerator INTEGER,
                             IN denominator INTEGER,
                             OUT result INTEGER)
   LANGUAGE SQL
   BEGIN
     DECLARE overflow CONDITION FOR SQLSTATE '22003';
     DECLARE CONTINUE HANDLER FOR overflow
       RESIGNAL SQLSTATE '22375';
     IF denominator = 0 THEN
       SIGNAL overflow;
     ELSE
       SET result = numerator / denominator;
     END IF;
   END