RESIGNAL ステートメント

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

呼び出し

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

許可

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

構文

Read syntax diagramSkip visual syntax diagramRESIGNALSQLSTATEVALUEsqlstate-string-constantsqlstate-string-variablecondition-namesignal-information
signal-information
Read syntax diagramSkip visual syntax diagramSETMESSAGE_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-定数
sqlstate-string-constant は、正確に 5 文字の文字ストリング定数でなければなりません。
sqlstate-string-変数
指定する SQL 変数または SQL パラメーターは、データ・タイプ CHAR(5) でなければならず、NULL 値であってはなりません。
条件名
戻される条件の名前を指定します。 condition-name は、compound-statement 内で宣言されているか、または現行のサーバーに存在する条件を指定しなければなりません。
SET MESSAGE_TEXT =
エラーまたは警告を記述するストリングを指定します。 このストリングは、SQLCA の sqlerrmc フィールドに返されます。 実際のストリングが 70 バイトを超えている場合は、警告なしで切り捨てられます。
SQL 変数名 (SQL-variable-name)
メッセージ・テキストを含む、コンパウンド・ステートメント内で宣言される SQL 変数を識別します。
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 値または condition-name とそれに関連した SQLSTATE 値を使用して RESIGNAL ステートメントを発行した場合、戻される SQLCODE は、次のように SQLSTATE 値に基づきます。
    • 指定された SQLSTATE クラスが 01 または 02 の場合、警告または NOT FOUND 条件が戻され、SQLCODE が +438 に設定されます。
    • それ以外の場合、例外条件が戻され、SQLCODE は -438 に設定されます。
  • RESIGNAL ステートメントは、SQLCA の示されているフィールドを以下のように設定しています。
    • sqlerrd フィールドはゼロに設定されます
    • sqlwarn フィールドはブランクに設定されます
    • sqlerrmc は、MESSAGE_TEXT の最初の 70 バイトに設定されます
    • sqlerrml は、sqlerrmc の長さに設定されるか、または 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