7.9.1 SIGNAL文の形式と規則
(1) 機能
エラーを発生させて,通知します。このとき,この時点までに診断領域へ設定していた情報をクリアします。
(2) 形式
SIGNAL 信号値 信号値::={SQLSTATE値|条件名} SQLSTATE値::=SQLSTATE 〔VALUE〕 文字列定数
(3) オペランド
(a) 信号値::={SQLSTATE値|条件名}
UAPに返す値を指定します。
(b) SQLSTATE値::=SQLSTATE 〔VALUE〕 文字列定数
SQLSTATE値として有効な値(A〜Zの大文字,及び0〜9の数字の組み合わせ)を5文字で指定してください。ただし,次のHiRDBでのSQLSTATEの規則に従って値を指定してください。
-
SQLSTATEクラス(最初の2文字)に'00','01','02',及び'R2'は指定できません。これらの値はエラーを表すクラスではありません。
-
最初の1文字が'0'〜'5','A'〜'I',及び'R'で始まるSQLSTATEクラスは指定できません。これらの値はHiRDBで予約されています。
SQLSTATEクラスがこれらの規則に従っていない場合,定義時にエラーとなります。SQLSTATE値については,「SQLSTATE変数」を参照してください。
(c) 条件名
条件宣言で宣言した条件名を指定してください。
条件名を指定した場合,SQLSTATEにはエラーを示す'R0000'(異常終了で暗黙的ロールバックなし)が設定されます。
条件名に対応したSQLCODE値を定義している場合,エラーとなります。
(4) 共通規則
-
SIGNAL文を実行した場合は,SQLCODEに-1400が設定されます。
-
SIGNAL文を実行しても,暗黙的ロールバックにはなりません。ただし,トリガの中で実行した場合は,WITHOUT ROLLBACKを指定して定義した表を除いて,暗黙的ロールバックになります。WITHOUT ROLLBACKを指定して定義した表については,SIGNAL文をトリガの中で実行しても,行更新(追加,削除を含む)の処理完了後はロールバックしません。
-
SIGNAL文を実行すると,SIGNAL文を実行する前に設定されていた診断領域の条件情報項目の情報はクリアされます。
診断領域の文情報項目のNUMBERには1が,MOREには'N'が設定されます。
1番目(条件番号:1)の条件情報項目のERROR_SQLには,'SIGNAL'が設定されます。また,信号値に条件名を指定した場合は,CONDITION_IDENTIFIERに条件名が,SQLSTATE値を指定した場合はCONDITION_IDENTIFIERに'SQLSTATE:xxxxx'(xxxxxは,指定したSQLSTATE値)が設定されます。
(5) 留意事項
-
SIGNAL文は,SQL手続き,及びトリガ中に指定できます。
-
SIGNAL文を実行すると,実行前に設定されていた診断領域の診断情報はクリアされます。それ以前の診断情報の履歴をクリアしない場合は,RESIGNAL文を使用してください。
(6) 使用例
-
在庫表(ZAIKO)に対し,指定した商品コードの数量を更新するSQL手続き(ZAIKO_KOUSIN1)を定義します。入力パラメタに指定した数量が負の値の場合,SIGNAL文でエラーを発生させ,「数量として無効な値です。」というメッセージを出力パラメタに設定します。
CREATE PROCEDURE ZAIKO_KOUSIN1(IN USCODE INT, IN USURYO INT, OUT MSG NVARCHAR(50)) BEGIN DECLARE illegal_value CONDITION ; DECLARE EXIT HANDLER FOR illegal_value SET MSG=N'数量として無効な値です。'; DECLARE EXIT HANDLER FOR NOT FOUND SET MSG=N'指定された商品コードは登録されていません。'; IF USURYO<0 THEN SIGNAL illegal_value; ELSE UPDATE ZAIKO SET ZSURYO=USURYO WHERE ZSCODE=USCODE; SET MSG=N'更新が完了しました。'; END IF; END
-
在庫表(ZAIKO)の行を削除する前に,SIGNAL文でエラーを発生させ,在庫表からの行の削除を抑止するトリガ(SIGNALTRIG)を定義します。
CREATE TRIGGER SIGNALTRIG BEFORE DELETE ON ZAIKO SIGNAL SQLSTATE '99001'