DECLARE 条件
DECLARE ハンドラ
条件によっては、特別な扱いが求められます。これらの条件は、エラー並びにルーチンの内側で行われている一般フロー制御に関連している場合もあります。
DECLARE 条件DECLAREcondition_nameCONDITION FORcondition_valuecondition_value: SQLSTATE [VALUE]sqlstate_value|mysql_error_code
このステートメントは特別な扱いが必要な条件を規定します。それには規定されたエラーの条件を含む名称が関連付けられます。その名称は後にDECLARE HANDLERステートメントの中で使われます。項2. 「DECLARE ハンドラ」 を参照してください。
condition_valueをSQLSTATE値もしくはMySQLエラーコードにすることができます。
DECLARE ハンドラ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 = value), もしくは、BEGIN と END を使って書いた複合ステートメントにすることができます。(項 「BEGIN ... END 複合ステートメント構文」参照)
CONTINUEハンドラに対して、現ルーチンの実行が、ハンドラステートメントの実行の後に続きます。EXIT ハンドラに関しては、ハンドラが宣言された BEGIN ... END コンパウンドステートメントの中で実行が終了します。(これは、条件が内側にあるブロックの中に発生する場合でも同じです。)UNDO ハンドラタイプのステートメントはまだサポートされていません。
ハンドラがまだ宣言されていない条件がしている場合、デフォルトアクションはEXITとなります。
A condition_valueは以下の値のいずれかにすることができます:
SQLSTATE値もしくはMySQLエラーコード。
既に DECLARE ... CONDITIONで指定されている条件名。項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;