资讯: 新闻 | 职场培训 服务: 论坛 | 博客 | 招聘 | 软件 | 辞典 | 网址 | 白皮书 | 教程 | 专题 | 订阅
文档: 前沿技术 | 组网 | 系统应用 | 安全 | 编程 | 存储 | 操作系统 | 数据库 | 服务器 | 案例库 | 产品
专栏: Java | .Net | 路由 | 交换 | iSCSI | SAS | 刀片 | Windows | Oracle | SQL | SOA | 中间件 | 杀毒
当前位置:首页>>专题总汇>>MySQL基础与配置>>正文 其它栏目:
MySQL5的异常处理(2)
http://www.51cto.com 2005-11-29 11:49 出处:Chinaitlab
【导读】本文介绍MySQL5的异常处理问题
6. DECLARE CONTINUE HANDLER example

CREATE TABLE t4 (s1 int,primary key(s1));//

CREATE PROCEDURE p23 ()

BEGIN

DECLARE CONTINUE HANDLER

FOR SQLSTATE '23000' SET @x2 = 1;

SET @x = 1;

INSERT INTO t4 VALUES (1);

SET @x = 2;

INSERT INTO t4 VALUES (1); <--

SET @x = 3;

END;//

然后程序尝试再次往主键表中插入数值,但失败了,因为主键有唯一性限制。

7. DECLARE CONTINUE HANDLER example

CREATE TABLE t4 (s1 int,primary key(s1));//

CREATE PROCEDURE p23 ()

BEGIN

DECLARE CONTINUE HANDLER

FOR SQLSTATE '23000' SET @x2 = 1; <--

SET @x = 1;

INSERT INTO t4 VALUES (1);

SET @x = 2;

INSERT INTO t4 VALUES (1);

SET @x = 3;

END;//

由于插入失败,错误处理程序被触发,开始进行错误处理。下一个执行的语句是错误处理的语句,@x2被设为2。

8. DECLARE CONTINUE HANDLER example

CREATE TABLE t4 (s1 int,primary key(s1));//

CREATE PROCEDURE p23 ()

BEGIN

DECLARE CONTINUE HANDLER

FOR SQLSTATE '23000' SET @x2 = 1;

SET @x = 1;

INSERT INTO t4 VALUES (1);

SET @x = 2;

INSERT INTO t4 VALUES (1);

SET @x = 3; <--

END;//

到这里并没有结束,因为这是CONTINUE异常处理。所以执行返回到失败的插入语句之后,继续执行将@x设定为3动作。

9. DECLARE CONTINUE HANDLER example

mysql> CALL p23()//

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @x, @x2//

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

| @x | @x2 |

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

| 3 | 1 |

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

1 row in set (0.00 sec)

运行过程后我们观察@x的值,很确定的可以知道是3,观察@x2的值,为1。从这里可以判断程序运行无误,完全按照我们的思路进行。大家可以花点时间去调整错误处理器,让检查放在语句段的首部,而不是放在可能出现错误的地方,虽然那样看起来程序很紊乱,跳来跳去的感觉。但是这样的代码很安全也很清楚。

1. DECLARE CONDITION

CREATE PROCEDURE p24 ()

BEGIN

DECLARE `Constraint Violation`

CONDITION FOR SQLSTATE '23000';

DECLARE EXIT HANDLER FOR

`Constraint Violation` ROLLBACK;

START TRANSACTION;

INSERT INTO t2 VALUES (1);

INSERT INTO t2 VALUES (1);

COMMIT;

END; //

这是另外一个错误处理的例子,在前面的基础上修改的。事实上你可给SQLSTATE或者错误代码其他的名字,你就可以在处理中使用自己定义的名字了。下面看它是怎么实现的:我把表t2定义为InnoDB表,所以对这个表的插入操作都会ROLLBACK(回滚),ROLLBACK(回滚事务)也是恰好会发生的。因为对主键插入两个同样的值会导致SQLSTATE 23000错误发生,这里SQLSTATE 23000是约束错误。

2. DECLARE CONDITION声明条件

CREATE PROCEDURE p24 ()

BEGIN

DECLARE `Constraint Violation`

CONDITION FOR SQLSTATE '23000';

DECLARE EXIT HANDLER FOR

`Constraint Violation` ROLLBACK;

START TRANSACTION;

INSERT INTO t2 VALUES (1);

INSERT INTO t2 VALUES (1);

COMMIT;

END; //

这个约束错误会导致ROLLBACK(回滚事务)和SQLSTATE 23000错误发生。

3. DECLARE CONDITION

mysql> CALL p24()//

Query OK, 0 rows affected (0.28 sec)

mysql> SELECT * FROM t2//

Empty set (0.00 sec)

我们调用这个存储过程看结果是什么,从上面结果我们看到表t2没有插入任何记录。全部事务都回滚了。这正是我们想要的。

4. DECLARE CONDITION

mysql> CREATE PROCEDURE p9 ()

-> BEGIN

-> DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;

-> DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END;

-> DECLARE EXIT HANDLER FOR SQLWARNING BEGIN END;

-> END;//

Query OK, 0 rows affected (0.00 sec)

这里是三个预声明的条件:NOT FOUND (找不到行), SQLEXCEPTION (错误),SQLWARNING (警告或注释)。因为它们是预声明的,因此不需要声明条件就可以使用。不过如果你去做这样的声明:"DECLARE SQLEXCEPTION CONDITION ...",你将会得到错误信息提示。



共2页: 上一页 [1] 2
[好文章鼓励一下] [烂文章骂两句]
※相关文章※
·PHP-Nuke存在远程SQL注入漏洞 后台数据库堪忧 (2006/03/07 09:47)
·把Access数据库移植到SQL (2006/03/02 10:56)
·InterBase/Firebird v4.1的SQL Manager发布 (2006/03/02 09:54)
·SQL:JOIN之完全用法 (2006/01/25 13:36)
·MySQL5.0新品推介 (2006/01/13 00:00)
·SQL Sever 2005新品推荐 (2006/01/13 00:00)
·Benders Calendar多个SQL脚本漏洞 (2006/01/17 11:40)
·WP-Stats WordPress Plug-in "author" SQL注入漏洞 (2006/01/17 11:38)
※推荐专题※

MySQL备份
※最新评论※ [查看评论]
[称赞还是怒骂全听您说]
网友昵称: 发表评论 (评论内容不能超过250字,请自觉遵守互联网相关政策法规.) 进入论坛
文章搜索
关键字:
最新TOP200
点击TOP200

Copyright©2005-2006 51CTO.COM 版权所有