对 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) 当然,如果异常处理定义在外层。他的作用域就是整个过程. (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |