加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

对 MySQL 处理错误的案例进行说明

发布时间:2023-10-21 14:10:44 所属栏目:MySql教程 来源:
导读:这篇文章给大家分享的是有关MySQL异常处理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。针对存储过程 、触发器或函数内部语句可能发生的错误或警告信息,需要进行相关异常

这篇文章给大家分享的是有关MySQL异常处理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

针对存储过程 、触发器或函数内部语句可能发生的错误或警告信息,需要进行相关异常或称 例外的捕捉,然后作出相应的处理,异常处理的方式如下:

DECLARE {CONTINUE | EXIT} HANDLER FOR {SQLSTATE sqlstate_code| MySQL error code| condition_name} handler_actions

说明:

· Handler type (CONTINUE, EXIT) :处理类型,继续或退出

· Handler condition (SQLSTATE, MySQL error code, named condition) :触发条件

· Hander actions(错误触发的操作) 

注意:a、 exit只退出当前的block。

     b、 如果定义了handler_action,会在continue或exit之前执行。 

发生错误的条件有:

· mysql错误代码

· ANSI-standard SQLSTATE code. 具体可见:http://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html

· 命名条件,可自定可使用系统内置的SQLEXCEPTION, SQLWARNING,和 NOT FOUND.

当同时使用MySQl错误码,标准SQLSTATE错误码,命名条件(SQLEXCEPTION)来定义错误处理时,其捕获顺序是(只可捕获一条错误):

MYSQL码->SQLSTATE->命名条件

作用域:

begni..end内,哪果错误处理定义在begin ... end内,则在该begin...end之外的错误不会被捕获。

它能够捕获其它储过程的错误。

关于作用域,以如下过程为例

drop table nums;    

drop procedure pCreateNums;  

CREATE TABLE nums (  

    id INT NOT NULL PRIMARY KEY,  

    b INT NOT NULL  

);     

delimiter $$    

create procedure pCreateNums(cnt int)    

begin  

    begin    

    declare continue handler for sqlexception rollback;   

        start transaction;    

        insert into nums(id,b) values(cnt+1,1);        

        insert into nums(id,b) values(cnt,null);    

        insert into nums(id,b) values(cnt+2,1);        

        commit;  

    end;  

    insert into nums values(100,100);    

    select * from nums;  

end $$    

delimiter ;  

call pCreateNums(10); 

nums表b字段为非空.

内部的begin end 由一个异常处理的定义,类型为continue

那么在执行到下面sql的时候

     insert into nums(id,b) values(cnt,null);    

触发异常处理,回顾了之前的SQL

但是后面的SQL继续执行.

外层的begin end块也会执行.

结果如下:

mysql> call pCreateNums(10);

+-----+-----+

| id | b |

+-----+-----+

| 12 | 1 |

| 100 | 100 |

+-----+-----+

2 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

如果异常处理为Exit类型,则内层begin end 块回滚,内层其余SQL不再执行,

但是外层的SQL不受影响.因为异常处理是定义在内层的.

这就是异常处理的作用域.

结果如下:

mysql> call pCreateNums(10);

+-----+-----+

| id | b |

+-----+-----+

| 100 | 100 |

+-----+-----+

1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

当然,如果异常处理定义在外层。他的作用域就是整个过程.

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章