WEB开发网
开发学院数据库MySQL MySQL5的异常处理 阅读

MySQL5的异常处理

 2006-04-07 10:45:12 来源:WEB开发网   
核心提示: INSERT INTO t4 VALUES (1);SET @x = 2;INSERT INTO t4 VALUES (1);SET @x = 3; <--END;//到这里并没有结束,因为这是CONTINUE异常处理,MySQL5的异常处理(5),所以执行返回到失败的插入语句之后,

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 ...",你将会得到错误信息提示。

上一页  1 2 3 4 5 

Tags:MySQL 异常 处理

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接