RESIGNAL ステートメント
RESIGNAL ステートメントは、ハンドラーを活動化した条件を再通知するため、またはより高いレベルで処理できるように代替条件を作成するために、条件ハンドラー内で使用されます。 その結果、例外、警告、または検出不可の条件が、オプションのメッセージ・テキストと一緒に戻されます。
構文
signal-information:
説明
- 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 は変更されません。
- 指定した 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 