赞
踩
程序在执行过程中有可能出错。运行时错误叫做异常
默认情况下,当过程运行出错时,过程会立即终止,并打印系统错误消息
没有异常处理的存储过程,执行过程中非常难以预测执行结果,所以尽量存储过程中加上异常处理部分。
注意:
1、异常后面的第一条SQL语句(也可以是begin end)与异常是一起的,他们一起执行。
2、一开始执行语句时不执行异常处理部分,执行到报错的地方时,跳到异常处理的地方,如果能捕获就执行异常处理部分,不能捕获就不执行异常处理部分。执行完异常处理部分有两个选择continue、exit。
案例
1、
DELIMITER $$
CREATE PROCEDURE duplicate_teams(
OUT p_processed SMALLINT)
BEGIN
SET p_processed = 1;
INSERT INTO TEAMS VALUES(2,27,'third');
SET p_processed = 2;
END$$
DELIMITER ;
mysql> CALL duplicate_teams(@processed);
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
2、
DELIMITER $$ CREATE PROCEDURE small_mistake1( OUT error VARCHAR(5)) BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET error = '23000'; select error; SET error = '00000'; select error; INSERT INTO TEAMS VALUES(2,27,'third'); SET error = '23001'; END$$ DELIMITER ; mysql> call small_mistake1(@a); +-------+ | error | +-------+ | NULL | +-------+ | error | +-------+ | 00000 | mysql> select @a; +-------+ | @a | +-------+ | 23001 |
异常处理中的SQL语句,一般用来记录错误发生时的一些信息。
3、
delimiter $$ 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$$ delimiter ; CALL handlerdemo() mysql> select @x2; +------+ | @x2 | +------+ | 1 | mysql> select @x; +------+ | @x | +------&#
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。