通知 (SIGNAL) ステートメント

SIGNAL ステートメントは、エラー条件または警告条件を通知します。 これは、指定の SQLSTATE とオプションの条件情報項目 を使用して、 エラーまたは警告を戻します。 SQL 関数、SQL プロシージャー、または SQL トリガー内の SIGNAL の構文は、 他のコンテキストで SIGNAL ステートメントとしてサポートされているものと似ています。

詳しくは、SIGNALを参照してください。

構文

構文図を読む構文図をスキップする
                                   .-VALUE-.                                   
>>-+--------+--SIGNAL--+-SQLSTATE--+-------+--+-sqlstate-string-constant-+-+-->
   '-label:-'          |                      '-sqlstate-string-variable-' |   
                       '-SQL-condition-name--------------------------------'   

>--+--------------------+--------------------------------------><
   '-signal-information-'   

signal-information

          .-,-----------------------------------------------------------.     
          V                                                             |     
|--+-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----'                                        |   
   '-(--diagnostic-string-constant--)-------------------------------------'   

説明

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

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

SQLSTATE ストリング定数
SQLSTATE ストリング定数 は、 厳密に 5 文字の文字ストリング定数でなければなりません。
SQLSTATE ストリング変数
SQLSTATE ストリング変数 は、文字または Unicode グラフィック変数でなければなりません。変数 の内容の実際の長さは、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 変数として定義する必要があります。
診断ストリング定数
条件情報項目 に割り当てる値を含む、 文字ストリング定数を指定します。
(診断ストリング定数)
メッセージ・テキストを入れる文字ストリング定数を指定します。

この形式が使用できるのは、CREATE TRIGGER ステートメントのトリガー・アクションにおいてのみです。

ANS および ISO 規格に準拠するためには、この形式は使用してはなりません。 これは、他のプロダクトとの互換性のために提供されています。

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

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

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

SIGNAL ステートメントの処理: SIGNAL ステートメントが実行された場合、 SQLCA で戻される SQLCODE は、次のように SQLSTATE 値に基づいて設定されます。

  • 指定された SQLSTATE クラスが '01' または '02' の場合、警告または NOT FOUND が通知され、SQLCODE は +438 に設定されます。
  • それ以外の場合、例外が通知され、SQLCODE は -438 に設定されます。

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

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

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

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

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

カスタマー番号がアプリケーションに知られていない場合に アプリケーション・エラーを通知するオーダー・システム用の SQL プロシージャー。 ORDERS 表には CUSTOMER 表への外部キーが含まれるので、 オーダーが挿入可能になる前に CUSTNO が存在している必要があります。

   CREATE PROCEDURE SUBMIT_ORDER
      (IN ONUM INTEGER, IN CNUM INTEGER,
       IN PNUM INTEGER, IN QNUM INTEGER)
       LANGUAGE SQL
       MODIFIES SQL DATA
      BEGIN
         DECLARE EXIT HANDLER FOR SQLSTATE VALUE '23503'
            SIGNAL SQLSTATE '75002'
               SET MESSAGE_TEXT = 'Customer number is not known';
         INSERT INTO ORDERS (ORDERNO, CUSTNO, PARTNO, QUANTITY)
            VALUES (ONUM, CNUM, PNUM, QNUM); 	
      END