DECLARE handler_action HANDLERFOR condition_value [, condition_value] ...statementhandler_action: {CONTINUE| EXIT| UNDO}condition_value: {mysql_error_code| SQLSTATE [VALUE] sqlstate_value| condition_name| SQLWARNING| NOT FOUND| SQLEXCEPTION}
DECLARE CONTINUE HANDLER FOR 1051BEGIN-- body of handlerEND;
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'BEGIN-- body of handlerEND;
DECLARE CONTINUE HANDLER FOR SQLWARNINGBEGIN-- body of handlerEND;
DECLARE CONTINUE HANDLER FOR NOT FOUNDBEGIN-- body of handlerEND;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGIN-- body of handlerEND;
mysql> CREATE TABLE test.t (s1 INT, PRIMARY KEY (s1));Query OK, 0 rows affected (0.00 sec)mysql> delimiter //mysql> CREATE PROCEDURE handlerdemo ()BEGINDECLARE 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)
DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN END;
CREATE PROCEDURE p ()BEGINDECLARE i INT DEFAULT 3;retry:REPEATBEGINDECLARE CONTINUE HANDLER FOR SQLWARNINGBEGINITERATE retry; # illegalEND;IF i < 0 THENLEAVE retry; # legalEND IF;SET i = i - 1;END;UNTIL FALSE END REPEAT;END;
ERROR 1308 (42000): LEAVE with no matching label: retry
DECLARE EXIT HANDLER FOR SQLWARNING BEGIN END;
DECLARE EXIT HANDLER FOR SQLWARNINGBEGINblock cleanup statementsEND;
CREATE PROCEDURE p ()BEGINDECLARE i INT DEFAULT 3;DECLARE done INT DEFAULT FALSE;retry:REPEATBEGINDECLARE CONTINUE HANDLER FOR SQLWARNINGBEGINSET done = TRUE;END;IF done OR i < 0 THENLEAVE retry;END IF;SET i = i - 1;END;UNTIL FALSE END REPEAT;END;
文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




