再通知 (RESIGNAL) ステートメント

RESIGNAL ステートメントは、現行条件を再発生、または代替条件を発生させて、その処理がより高いレベルで行われるようにするために条件ハンドラー内で使用されます。 これにより、オプションのメッセージ・テキストと一緒に例外、警告、または NOT FOUND 条件が返されます。

オペランドを指定せずに RESIGNAL ステートメントを実行すると、現行条件が外部に渡されます。

構文

構文図を読む構文図をスキップする
>>-+--------+--RESIGNAL----------------------------------------->
   '-label:-'             

>--+-------------------------------------------------------------------------------+-><
   |             .-VALUE-.                                                         |   
   '-+-SQLSTATE--+-------+--+-sqlstate-string-constant-+-+--+--------------------+-'   
     |                      '-sqlstate-string-variable-' |  '-signal-information-'     
     '-SQL-condition-name--------------------------------'                             

signal-information

|--SET--+-MESSAGE_TEXT-------+-- = --+-SQL-variable-name----------+--|
        +-CONSTRAINT_CATALOG-+       +-SQL-parameter-name---------+   
        +-CONSTRAINT_SCHEMA--+       '-diagnostic-string-constant-'   
        +-CONSTRAINT_NAME----+                                        
        +-CATALOG_NAME-------+                                        
        +-SCHEMA_NAME--------+                                        
        +-TABLE_NAME---------+                                        
        +-COLUMN_NAME--------+                                        
        +-CURSOR_NAME--------+                                        
        +-CLASS_ORIGIN-------+                                        
        '-SUBCLASS_ORIGIN----'                                        

説明

label
RESIGNAL ステートメントのラベルを指定します。 このラベル名は、ルーチン名または同じ有効範囲内の別のラベルと同じものにすることはできません。 詳しくは、SQL ラベルの参照を参照してください。
SQLSTATE VALUE
再通知可能な SQLSTATE を指定します。任意の有効な SQLSTATE 値を使用できます。指定値は SQLSTATE の以下の規則に従っていなければなりません。
  • 各文字は、数字 ('0' から '9') またはアクセント記号なしの英大文字 ('A' から 'Z') でなければなりません。
  • SQLSTATE クラス (最初の 2 文字) は、'00' であってはなりません (これは 正常終了を表します)。

SQLSTATE がこの規則に従っていないと、エラーが戻されます。

SQLSTATE ストリング定数
SQLSTATE ストリング定数 は、 厳密に 5 文字の文字ストリング定数でなければなりません。
SQLSTATE ストリング変数
SQLSTATE ストリング変数 は、文字または Unicode グラフィック変数でなければなりません。SQLSTATE ストリング変数 の内容の実際の長さは、5 でなければなりません。
SQL-condition-name
戻される条件の名前を指定します。 SQL-condition-namecompound-statement の中で宣言する必要があります。
SET
条件情報項目 への値の割り当てを指定します。 条件情報項目 値は、 GET DIAGNOSTICS ステートメントを使用してアクセスできます。 SQLCA 内でアクセス可能な条件情報項目 は、MESSAGE_TEXT だけです。
MESSAGE_TEXT
エラーまたは警告を説明するストリングを指定します。

SQLCA を使用する場合、

  • このストリングは、SQLCA の SQLERRMC フィールドに戻されます。
  • ストリングの実際の長さが 1000 バイトを超える場合、警告せずに切り捨てられます。
CONSTRAINT_CATALOG
通知されたエラーまたは警告に関連する制約を含む、データベースの名前を示すストリングを指定します。
CONSTRAINT_SCHEMA
通知されたエラーまたは警告に関連する制約を含む、スキーマの名前を示すストリングを指定します。
CONSTRAINT_NAME
通知されたエラーまたは警告に関連する制約の名前を示すストリングを指定します。
CATALOG_NAME
通知されたエラーまたは警告に関連する表またはビューを含む、データベースの名前を示すストリングを指定します。
SCHEMA_NAME
通知されたエラーまたは警告に関連する表またはビューを含む、スキーマの名前を示すストリングを指定します。
TABLE_NAME
通知されたエラーまたは警告に関連する表またはビューの名前を示すストリングを指定します。
COLUMN_NAME
通知されたエラーまたは警告に関連する表またはビューの列名を示すストリングを指定します。
CURSOR_NAME
通知されたエラーまたは警告に関連するカーソルの名前を示すストリングを指定します。
CLASS_ORIGIN
通知されたエラーまたは警告に関連する SQLSTATE クラスの起点を示すストリングを指定します。
SUBCLASS_ORIGIN
通知されたエラーまたは警告に関連する SQLSTATE サブクラスの起点を示すストリングを指定します。
SQL-variable-name
条件情報項目 に割り当てる値を含む、 複合ステートメント 内で宣言される SQL 変数を示します。 SQL 変数は、CHAR、VARCHAR、Unicode GRAPHIC、または Unicode VARGRAPHIC 変数として定義する必要があります。
SQL-parameter-name
条件情報項目 に割り当てる値を含む、 複合ステートメント 内で宣言される SQL パラメーターを示します。 SQL パラメーターは、CHAR、VARCHAR、Unicode GRAPHIC、または Unicode VARGRAPHIC 変数として定義する必要があります。
診断ストリング定数
条件情報項目 に割り当てる値を含む、 文字ストリング定数を指定します。

SQLSTATE 値: RESIGNAL ステートメントには、任意の有効な SQLSTATE 値を使用できますが、 プログラマーは、アプリケーション用に予約されている範囲に基づいて、 新規の SQLSTATE を定義することをお勧めします。 そうすれば、使用する SQLSTATE 値が今後リリースされるデータベース・マネージャーで定義される 値と重なってしまう可能性を防止できます。

SQLSTATE の詳細については、「SQL メッセージおよびコード」トピック集を参照してください。

割り当て: RESIGNAL ステートメントが実行されるとき、 指定した各ストリング定数 および変数 の値は、 対応する条件情報項目 に割り当てられます。 ただし、ストリング定数 または変数 の長さが対応する条件情報項目 の最大長を超える場合は、警告せずに切り捨てられます。 割り当て規則の詳細については、割り当ておよび比較を参照してください。 特定の条件情報項目 の最大長については、 GET DIAGNOSTICSを参照してください。

RESIGNAL ステートメントの処理:

  • RESIGNAL ステートメントを SQLSTATE 文節や SQL-condition-name なしで指定する 場合、SQL 関数、SQL プロシージャー、または SQL トリガーは、ハンドラーを呼び出したのと同一の条件で再通知し、SQLCODE は変更されません。
  • RESIGNAL ステートメントが発行され、 SQLSTATE または SQL-condition-name が指定されている場合は、 SQLCODE は次のように SQLSTATE 値に基づいて設定されます。
    • 指定された SQLSTATE クラスが '01' または '02' の場合、警告または NOT FOUND が通知され、SQLCODE は +438 に設定されます。
    • それ以外の場合、例外が戻され、SQLCODE は -438 に設定されます。

SQLSTATE または条件が、例外が通知されたこと (SQLSTATE クラス が '01' または '02' 以外) を示している場合は、次のようになります。

  • その RESIGNAL ステートメントと同じ 複合ステートメント内にハンドラーが存在し、しかも 複合ステートメント の 中に SQLEXCEPTION、あるいは指定の SQLSTATE または条件に対する ハンドラーが含まれている場合は、例外は処理され、制御はその ハンドラーに渡されます。
  • 複合ステートメント が ネストされていて、外側の複合ステートメント の 中に SQLEXCEPTION あるいは指定の SQLSTATE または条件に対する ハンドラーが含まれている場合は、例外は処理され、制御はそのハンドラー に渡されます。
  • それ以外の場合は、例外は処理されず、制御は即時に複合ステートメント の終了点に戻されます。

SQLSTATE または条件が、警告 (SQLSTATE クラス '01') または NOT FOUND (SQLSTATE クラス '02') が通知されたことを示している場合は、次のように なります。

  • その RESIGNAL ステートメントと同じ 複合ステートメント内にハンドラーが存在し、しかも複合ステートメント の 中に SQLWARNING (SQLSTATE クラスが '01' の 場合)、NOT FOUND (SQLSTATE クラスが '02' の場合)、または 指定の SQLSTATE または条件に対するハンドラーが含まれている場合は、警告または NOT FOUND 条件は処理され、制御はそのハンドラーに 渡されます。
  • 複合ステートメント がネストされていて、 外側のレベルの複合ステートメントの中に、SQLWARNING (SQLSTATE クラス が '01' の場合)、NOT FOUND (SQLSTATE クラスが '02' の場合)、 または指定の SQLSTATE または条件に対するハンドラーが含まれている場合は、警告または NOT FOUND 条件 は処理されず、次のステートメントから処理を継続します。
  • それ以外の場合、警告は処理されず、次のステートメントから処理を継続し ます。

診断領域に関する考慮事項: RESIGNAL ステートメントは、現行の診断領域の内容を変更する場合があります。 SQLSTATE または SQL-condition-name が RESIGNAL ステートメントの一部として指定された場合、RESIGNAL ステートメントが診断領域のクリアを指定して開始し、指定された SQLSTATE または SQL-condition-name を反映するように RETURNED_SQLSTATE を設定します。 通知情報 が指定されると、条件領域内の対応する項目に指定された値が割り当てられます。 DB2_RETURNED_SQLCODE は、指定された SQLSTATE または SQL-condition-name に対応して +438 または -438 に設定されます。

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

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