DECLARE condition_name CONDITION FOR condition_value condition value: SQLSTATE [VALUE] sqlstate_value | mysql_error_code其中:
//方法一:使用sqlstate_value DECLARE can_not_find CONDITION FOR SQLSTATE '42S02'; //方法二:使用 mysql_error_code DECLARE can_not_find CONDITION FOR 1146;
DECLARE handler_type HANDLER FOR condition_value[...] sp_statement handler_type: CONTINUE | EXIT | UNDO condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code其中,handler_type 参数指明错误的处理方式,该参数有 3 个取值。这 3 个取值分别是 CONTINUE、EXIT 和 UNDO。
//方法一:捕获 sqlstate_value DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='CAN NOT FIND'; //方法二:捕获 mysql_error_code DECLARE CONTINUE HANDLER FOR 1146 SET @info='CAN NOT FIND'; //方法三:先定义条件,然后调用 DECLARE can_not_find CONDITION FOR 1146; DECLARE CONTINUE HANDLER FOR can_not_find SET @info='CAN NOT FIND'; //方法四:使用 SQLWARNING DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR'; //方法五:使用 NOT FOUND DECLARE EXIT HANDLER FOR NOT FOUND SET @info='CAN NOT FIND'; //方法六:使用 SQLEXCEPTION DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';上述代码是 6 种定义处理程序的方法。
mysql> CREATE TABLE t8(s1 INT,PRIMARY KEY(s1)); Query OK, 0 rows affected (0.07 sec) mysql> DELIMITER // mysql> CREATE PROCEDURE handlerdemo() -> BEGIN -> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1; -> SET @X=1; -> INSERT INTO t8 VALUES(1); -> SET @X=2; -> INSERT INTO t8 VALUES(1); -> SET @X=3; -> END // Query OK, 0 rows affected (0.02 sec) mysql> DELIMITER ; mysql> CALL handlerdemo(); Query OK, 0 rows affected (0.01 sec) mysql> SELECT @X; +------+ | @X | +------+ | 3 | +------+ 1 row in set (0.00 sec)上述代码中,@X 是一个用户变量,执行结果 @X 等于 3,这表明 MySQL 执行到程序的末尾。
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1;
这一行不存在,第二个 INSERT 因 PRIMARY KEY 约束而失败之后,MySQL 可能已经采取 EXIT 策略,且 SELECT @X 可能已经返回 2。Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有