MySQL数据库的例外处理测试

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

USE TEST;

CREATE TABLE `eugene` (
`ID` int(11) NOT NULL,
PRIMARY KEY  (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312;

delimiter $$
DROP PROCEDURE IF EXISTS `test`.`handlerdemo`$$
CREATE PROCEDURE handlerdemo ()
BEGIN
DECLARE X2 INT;
DECLARE CONTINUE HANDLER FOR SQLWARNING       SET X2= 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND             SET X2 = 2;
DECLARE CONTINUE HANDLER FOR SQLSTATE ’23000′    SET X2= 3;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION     SET X2 = 4;
INSERT INTO  eugene  VALUES (X2);
SELECT X2;
END;
$$

执行完上面的代码后,你可以反复执行:
CALL handlerdemo ()

看显示的结果是什么?
第一次运行,肯定为 NULL;
第二次运行,肯定为 3;

然后再修改存储过程,把存储过程中的代码:DECLARE CONTINUE HANDLER FOR SQLSTATE ’23000′    SET X2= 3;注释掉,在之前的基础上再次执行:
CALL handlerdemo ()
发现运行后的结果为 4;

剩下的SQLWARNING,NOT FOUND也类似,下面介绍下各自发挥的作用:
SQLWARNING是对所有以01开头的SQLSTATE代码的速记。(这个我自己的存储过程中还没用到过)
NOT FOUND是对所有以02开头的SQLSTATE代码的速记。(例如:游标产生的SQLSTATE=02000)
SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。(相当于Oracle中写例外处理的when ….else 中的else作用)。
SQLSTATE—-就是触发的错误代码编号,示例中的23000表示,当向eugene表中主键写入重复的值的时候,将会引发一个语法错误,错误编码就是23000,这个时候就会执行其后的语句:SET X2= 3。

官网上的语法:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement

handler_type:
CONTINUE
| EXIT
| UNDO

condition_value:
SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mysql_error_code

觉得文章有用?立即: 和朋友一起 共学习 共进步!

猜想失败,您看看下面的文章有用吗?

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>