DECLAREhandler_typeHANDLER FORcondition_value[,...]statementhandler_type: CONTINUE | EXIT | UNDOcondition_value: SQLSTATE [VALUE]sqlstate_value|condition_name| SQLWARNING | NOT FOUND | SQLEXCEPTION |mysql_error_code
DECLARE ...
HANDLERステートメントは各々が複数の条件で処理することができるハンドラを規定します。もし、これらの条件の1つが起った場合、ステートメントが実行されます。この場合、ステートメントを単純なものにすることができます。
(例えば、 SET ),
もしくは、var_name
= valueBEGIN と
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;
