异常处理
程序在执行过程中有可能出错。运行时错误叫做异常
默认情况下,当过程运行出错时,过程会立即终止,并打印系统错误消息
没有异常处理的存储过程,执行过程中非常难以预测执行结果,所以尽量存储过程中加上异常处理部分。
注意:
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 |
+------+
| 3 |
<