DECLAREhandler_type
HANDLER FORcondition_value
[,...]statement
handler_type
: CONTINUE | EXIT | UNDOcondition_value
: SQLSTATE [VALUE]sqlstate_value
|condition_name
| SQLWARNING | NOT FOUND | SQLEXCEPTION |mysql_error_code
DECLARE ...
HANDLER
ステートメントは各々が複数の条件で処理することができるハンドラを規定します。もし、これらの条件の1つが起った場合、ステートメント
が実行されます。この場合、ステートメント
を単純なものにすることができます。
(例えば、 SET
),
もしくは、var_name
= value
BEGIN
と
END
を使って書いた複合ステートメントにすることができます。(項17.2.5. 「BEGIN ... END
複合ステートメント構文」参照)
CONTINUE
ハンドラに対して、現ルーチンの実行が、ハンドラステートメントの実行の後に続きます。EXIT
ハンドラに関しては、ハンドラが宣言された
BEGIN ... END
コンパウンドステートメントの中で実行が終了します。(これは、条件が内側にあるブロックの中に発生する場合でも同じです。)UNDO
ハンドラタイプのステートメントはまだサポートされていません。
ハンドラがまだ宣言されていない条件がしている場合、デフォルトアクションはEXIT
となります。
A
condition_value
は以下の値のいずれかにすることができます:
SQLSTATE値もしくはMySQLエラーコード。
既に DECLARE ...
CONDITION
で指定されている条件名。項17.2.8.1. 「DECLARE
条件」
を参照してください。
SQLWARNING
は01
で始まる全てのSQLSTATEコードに対する速記文字です。
NOT
FOUND
は02
で始まる全てのSQLSTATEコードに対する速記文字です。
SQLEXCEPTION
はSQLWARNING
またはNOT
FOUND
によって捕らえられなかった全てのSQLSTATEコードの速記文字です。
例:
mysql>CREATE TABLE test.t (s1 int,primary key (s1));
Query OK, 0 rows affected (0.00 sec) mysql>delimiter //
mysql>CREATE PROCEDURE handlerdemo ()
->BEGIN
->DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
->SET @x = 1;
->INSERT INTO test.t VALUES (1);
->SET @x = 2;
->INSERT INTO test.t VALUES (1);
->SET @x = 3;
->END;
->//
Query OK, 0 rows affected (0.00 sec) mysql>CALL handlerdemo()//
Query OK, 0 rows affected (0.00 sec) mysql>SELECT @x//
+------+ | @x | +------+ | 3 | +------+ 1 row in set (0.00 sec)
その例は、重複キーエラーに対して発生するSQLSTATE
23000を持つハンドラに関連するものです。@x
は 3
です。 MySQLがプロシージャの最後まで実行されたことを示しています。もしDECLARE
CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 =
1;
ラインが存在していなかった場合、
MySQLは(EXIT
)
のデフォルトパスを、2番目のINSERT
がPRIMARY
KEY
制限によって失敗したとき取り、そしてSELECT
@x
は2
を返しています。
条件を無視したい場合、ユーザはそれに対して、CONTINUE
ハンドラと宣言して、それを空のブロックと関連させることができます。例:
DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN END;