1,定义
与java中的异常一样,都是用来定义在处理过程中遇到的问题以及相应的处理方式。
2,自定义异常及处理方式
1,自定义异常语句
DECLARE condition_name CONDITION FOR condition_value;
condition_name:是自己起的名字,最好见名知意。
condition_value:可以是SQLSTATE[VALUE] sqlstate_value也可以是mysql_error_value。
sqlstate_value是长度为5的字符串错误代码。
mysql_error_value是数值类型的错误代码。
2,自定义异常处理
DECLARE handler_type HANDLER FOR condition_value sp_statement;
handler_type:有三个取值
CONTINUE:遇到错误不进行处理,跳过错误继续执行之后的代码。
EXIT:遇到错误时马上退出,不再执行之后的操作。
UNDO:遇到错误后撤回之前已经执行的操作,MySQL暂不支持该操作。
condition_value:错误名称:有以下取值
condition_name:定义异常时取的名字
mysql_error_value:数值类型的错误代码
SQLWARNING:对所有01开头的SQLSTATE代码的速记
NOT FOUND:对所有01开头的SQLSTATE代码的速记
SQLEXCEPTION:除SQLWARNING和NOT FOUND之外的SQLSTATE代码的速记。
sp_statement:异常之后的处理。
3,实例展示
创建以下表格,将u_id设置为主键,并插入以下数据:
创建一个名为insert_user的存储过程:
BEGIN
set @x = 1;insert into users values(3,'zhaoliu',26);set @x = 2;insert into users values(4,'zhouqi',27);set @x = 3;END
通过使用用户变量@x来查看代码是否运行,调用存储过程
call insert_user();
出现以下错误
其中数字1062就是mysql_error_code。对应的sqlstate_value是‘23000’,具体的对应方式可以看对应表。
查看@x的值
select @x;
可以看到u_id = 3的这条语句出现了异常。
接下来我们加入异常处理:
BEGIN#Routine body goes here...
#方式一:直接异常处理
#declare exit HANDLER FOR 1062 set @x1 = 4;
#方式二:先自定义异常,再使用异常处理DECLARE error1 CONDITION for 1062;declare exit HANDLER FOR 1062 set @x1 = 4; -- 在这里handler_type先使用exitset @x = 1;insert into users values(3,'zhaoliu',26);set @x = 2;insert into users values(4,'zhouqi',27);set @x = 3;END
在这里为了检验效果,我们设置的对异常的处理是将@x1设置为4。
再次调用该存储过程就不会报错了
select @x,@x1;
查询用户变量
发现当出现异常时,程序会执行异常的处理并且退出该过程。
将过程中的handler_type改成continue,再次执行该过程,也不会出错。
查询用户变量
发现对于异常处理之后,会继续运行之后的代码
查询users表
异常的插入语句没有执行,但是后面的没有发生异常的语句执行了。