与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设置为主键,并插入以下数据:

MySQL中的异常处理

    创建一个名为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();

 

    出现以下错误

MySQL中的异常处理

其中数字1062就是mysql_error_code。对应的sqlstate_value是‘23000’,具体的对应方式可以看对应表。

查看@x的值

select @x;

 

MySQL中的异常处理

可以看到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先使用exit
    set @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;

 

查询用户变量

MySQL中的异常处理

发现当出现异常时,程序会执行异常的处理并且退出该过程。

将过程中的handler_type改成continue,再次执行该过程,也不会出错。

查询用户变量

MySQL中的异常处理

发现对于异常处理之后,会继续运行之后的代码

查询users表

MySQL中的异常处理

异常的插入语句没有执行,但是后面的没有发生异常的语句执行了。