RESIGNAL ステートメント

RESIGNAL ステートメントは、ハンドラーを活動化した条件を再通知するため、またはより高いレベルで処理できるように代替条件を作成するために、条件ハンドラー内で使用されます。 その結果、例外、警告、または検出不可の条件が、オプションのメッセージ・テキストと一緒に戻されます。

構文

構文図を読むビジュアルシンタックスダイアグラムをスキップするラベル:RESIGNALSQLSTATEVALUEsqlstate-string-constantSQL-variable-nameSQL-parameter-nameSQL-condition-namesignal-information

signal-information:

構文図を読むビジュアルシンタックスダイアグラムをスキップするSETMESSAGE_TEXT=診断文字列表現

説明

label
変更の開始RESIGNAL ステートメントのラベルを指定します。 ラベル名は、ルーチン名、拡張トリガー名、または同じ有効範囲内の別のラベルと同じものにすることはできません。 詳細については、 SQL PLのSQLラベルへの参照を参照してください。変更の終わり
SQLSTATE VALUE
戻される SQLSTATE を指定します。 有効な SQLSTATE 値をどれでも使用できます。 SQLSTATE 値に関する規則に準拠した、 厳密に 5 文字の文字ストリング定数でなければなりません。
  • 各文字は、数字 (「0」から「9」) またはアクセントなしの大文字 (「A」から「Z」) のいずれかの文字でなければなりません。
  • SQLSTATE クラス (最初の 2 文字) は、「00」であってはなりません。これは正常終了を表します。

SQLSTATE がこれらの規則に準拠していない場合、エラーが発生します。

sqlstate-string-constant
有効な SQLSTATE 値である、実際の長さが 5 バイトの文字ストリング定数。
SQL変数名または SQLパラメータ名
ルーチン用に定義された SQL 変数または SQL パラメーターを指定します。
SQL変数名
RESIGNAL ステートメントを含む compound-statement 内、またはそのコンパウンド・ステートメントをネストしているコンパウンド・ステートメント内に宣言された SQL 変数を指定します。 SQL-variable-name は、実際の長さが 5 バイトの CHAR または VARCHAR データ・タイプとして定義し、NULL であってはならず、かつ、有効な SQLSTATE 値を含んでいる必要があります。
SQL_パラメータ名
ルーチン用に定義され、SQLSTATE 値を含む SQL パラメーターを指定します。 この SQL パラメーターは、実際の長さが 5 バイトの CHAR または VARCHAR データ・タイプとして定義し、NULL であってはならず、かつ、有効な SQLSTATE 値を含んでいる必要があります。
SQL条件名
戻す条件の名前を指定します。 SQL-condition-name は、RESIGNAL ステートメントを含む compound-statement 内、またはそのコンパウンド・ステートメントをネストしているコンパウンド・ステートメント内で宣言する必要があります。
SET MESSAGE_TEXT
エラーまたは警告を記述するストリングを指定します。 このストリングは SQLCA の SQLERRMC フィールドに戻されるほか、GET DIAGNOSTICS ステートメントによって戻されます。
診断文字列表現
エラー条件または警告条件を記述する、1000 バイトまでの文字ストリングを戻すデータ・タイプ CHAR または VARCHAR の式。 メッセージの全文の取得方法については、「診断結果を取得する」 を参照してください。

任意の有効な SQLSTATE 値を RESIGNAL ステートメントに使用できますが、プログラマーはアプリケーション用に予約されている範囲を基にして新しい SQLSTATE を定義するようにしてください。 こうすることにより、将来のリリースでデータベース・マネージャーによって定義される可能性がある SQLSTATE 値を意図せず使用することを防止できます。

この SQLSTATE または条件は、ある例外がシグナル通知 (「01」または「02」以外の SQLSTATE クラス) されることを示している場合、以下のことが該当します。

  • 条件処理ルーチンが RESIGNAL ステートメントと同じコンパウンド・ステートメント内にあり、かつ、そのコンパウンド・ステートメントには SQLEXCEPTION または指定された SQLSTATE または条件に対する条件処理ルーチンが含まれる場合、その例外が処理されて、制御がその条件処理ルーチンに引き渡されます。
  • このコンパウンド・ステートメントがネストされて、外部レベルのコンパウンド・ステートメントには SQLEXCEPTION または指定された SQLSTATE または条件に対する条件処理ルーチンがある場合、その例外が処理されて、制御はその条件処理ルーチンに受け渡されます。
  • それ以外の場合は、例外は処理されず、制御は即時にコンパウンド・ステートメントの最後に戻されます。

SQLSTATE またはある条件が、警告または検出不可の条件をシグナル通知することを示している場合、以下のことが該当します。

  • 条件処理ルーチンが RESIGNAL ステートメントと同じコンパウンド・ステートメント内にあり、かつ、そのコンパウンド・ステートメントには SQLWARNING、NOT FOUND、または指定の SQLSTATE または条件に対する条件処理ルーチンが含まれる場合、その警告または検出不可の条件が処理されて、制御がその条件処理ルーチンに引き渡されます。
  • このコンパウンド・ステートメントがネストされ、かつ、外部レベルのコンパウンド・ステートメントには SQLWARNING、NOT FOUND、または指定の SQLSTATE または条件に対する条件処理ルーチンが含まれる場合、警告または検出不可の条件が処理されて、制御はその条件処理ルーチンに戻されます。
  • そうでなければ、警告は処理されず、処理は次のステートメントから継続します。

診断領域に対する考慮事項: RESIGNAL ステートメントは現行の診断領域の内容を変更する可能性があります。 SQLSTATE または condition-name が、RESIGNAL ステートメントの一部として指定されている場合、RESIGNAL ステートメントはクリアな診断領域で始まり、RETURNED_SQLSTATE を設定して、指定の SQLSTATE または condition-name を反映します。 メッセージ・テキストを指定すると、条件領域の MESSAGE_TEXT 項目には指定した値が割り当てられます。 DB2_RETURNED_SQLCODE は、指定された SQLSTATE または condition-name に対応して +438 または -438 に設定されます。

RESIGNAL ステートメントの処理: SQLSTATE 節も condition-name も指定せずに RESIGNAL ステートメントを指定した場合、SQL ルーチンはそのハンドラーを呼び出した条件と同じ条件を再シグナル化し、SQLCODE は変更されません。

RESIGNAL ステートメントを発行するときに SQLSTATE または condition-name を指定した場合、SQLCODE は次のように SQLSTATE 値に基づいて設定されます。
  • 指定した SQLSTATE クラスが「01」または「02」の場合は、警告または検出不能がシグナル通知され、SQLCODE は +438 に設定されます。
  • それ以外の場合は、例外が戻され、SQLCODE は -438 に設定されます。

次の例では、ゼロによる除算のエラーを検出します。 IF ステートメントは、SIGNAL ステートメントを使用してオーバーフロー条件ハンドラーを呼び出します。 条件ハンドラーは、RESIGNAL ステートメントを使用して別の SQLSTATE をクライアント・アプリケーションに戻します。

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