当前位置: 首页 > 图文教程 > 数据库 > MYSQL > 带你轻松玩转MySQL数据库的异常处理

MYSQL
Mysql数据库常见的“#1251”錯誤分析
SQL 查询语句积累
MyGeneration连接MySql数据库的解决办法
新手扫盲:MySQL入门基础知识简介
如何在MySQL中获得更好的搜索结果
浅谈如何应用JDBC连接数据库MySQL
实际应用:MySQL5存储过程的编写实践
MySQL5的异常处理
SQL查询语句精华使用简要
MySQL数据库基础:数据类型及列类型
MySQL 忘记口令的解决办法
MySQL账户相关
MySQL存在权限提升及安全限制绕过漏洞
MySQL手册版本 5.0.20-MySQL优化(六)
新手入门--全面介绍MySQL的基础应用
一步步教你在Windows环境下安装MySQL
MySQL手册版本 5.0.20-MySQL优化(一)
MySQL手册版本 5.0.20-MySQL同步(三)
SQL查询语句对象化的实现(C#)
真的? MySQL被计划转为Linux文件系统

MYSQL 中的 带你轻松玩转MySQL数据库的异常处理


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 113 ::
收藏到网摘: n/a

对于MySQL的异常处理,本人不常用。不过我觉得还是有写下来的必要。

标准格式

DECLARE handler_type HANDLER FOR condition_value[,...] statement


handler_type:

CONTINUE

| EXIT

| UNDO --暂时不支持


condition_value:

SQLSTATE [VALUE] sqlstate_value

| condition_name

| SQLWARNING

| NOT FOUND

| SQLEXCEPTION

| mysql_error_code

condition_value细节

1、MySQL ERROR CODE 列表

如果需要查看更多的错误列表可以直接到MySQL安装路径下。

比如我的/usr/local/mysql/share/mysql/errmsg.txt

说明:SQLSTATE [VALUE] sqlstate_value这种格式是专门为ANSI SQL 和 ODBC以及其他的标准.

并不是所有的MySQL ERROR CODE 都映射到SQLSTATE。

2、假如不需要插入ERROR CODE,可以用速记条件来代替

SQLWARNING 代表所有以01开头的错误代码

NOT FOUND 代表所有以02开头的错误代码,当然也可以代表一个游标到达数据集的末尾。

SQLEXCEPTION 代表除了SQLWARNING和NOT FOUND 的所有错误代码。

3、具体示例:

CREATE TABLE t (s1 int,primary key (s1));

mysql> use t_girl

Database changed

mysql> CREATE TABLE t (s1 int,primary key (s1));

Query OK, 0 rows affected (0.00 sec)

mysql>

mysql>

mysql> DELIMITER ||

mysql> CREATE PROCEDURE handlerdemo ()

-> BEGIN

-> DECLARE EXIT HANDLER FOR SQLSTATE '23000' BEGIN END; -- 遇到重复键值就退出


-> SET @x = 1;

-> INSERT INTO t VALUES (1);

-> SET @x = 2;

-> INSERT INTO t VALUES (1);

-> SET @x = 3;

-> END||

Query OK, 0 rows affected (0.00 sec)


mysql> DELIMITER ;

mysql> call handlerdemo();

Query OK, 0 rows affected (0.00 sec)


mysql> select @x;

+------+


| @x |

+------+


| 2 |

+------+


1 row in set (0.00 sec)


mysql> call handlerdemo();

Query OK, 0 rows affected (0.00 sec)


mysql> select @x;

+------+


| @x |

+------+


| 1 |

+------+


1 row in set (0.00 sec)


mysql>

遇到错误继续的情况

 


mysql> truncate table t;

Query OK, 0 rows affected (0.01 sec)


mysql> DELIMITER $$

mysql> DROP PROCEDURE IF EXISTS `t_girl`.`handlerdemo`$$

Query OK, 0 rows affected (0.00 sec)


mysql> CREATE DEFINER=`root`@`localhost` PROCEDURE `handlerdemo`()

-> BEGIN

-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' BEGIN END;

-> SET @x = 1;

-> INSERT INTO t VALUES (1);

-> SET @x = 2;

-> INSERT INTO t VALUES (1);

-> SET @x = 3;

-> END$$

Query OK, 0 rows affected (0.01 sec)


mysql> DELIMITER ;

mysql> call handlerdemo();

Query OK, 0 rows affected (0.00 sec)


mysql> select @x;

+------+


| @x |

+------+


| 3 |

+------+


1 row in set (0.00 sec)


mysql> call handlerdemo();

Query OK, 0 rows affected (0.00 sec)


mysql> select @x;

+------+


| @x |

+------+


| 3 |

+------+


1 row in set (0.00 sec)


mysql>


我们可以看到,始终执行到最后。

当然,上面的SQLSTATE '23000'可以替换为1062。


警告:


mysql> alter table t add s2 int not null;

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0


这个列没有默认值,插入的时候会出现警告或者1364错误提示。

mysql> DELIMITER $$

mysql> DROP PROCEDURE IF EXISTS `t_girl`.`handlerdemo`$$

Query OK, 0 rows affected, 1 warning (0.00 sec)


mysql> CREATE DEFINER=`root`@`localhost` PROCEDURE `handlerdemo`()

-> BEGIN

-> DECLARE CONTINUE HANDLER FOR 1062 BEGIN END;

-> DECLARE CONTINUE HANDLER FOR SQLWARNING

-> BEGIN

-> update t set s2 = 2;

-> END;

-> DECLARE CONTINUE HANDLER FOR 1364

-> BEGIN

-> INSERT INTO t(s1,s2) VALUES (1,3);

-> END;

-> SET @x = 1;

-> INSERT INTO t(s1) VALUES (1);

-> SET @x = 2;

-> INSERT INTO t(s1) VALUES (1);

-> SET @x = 3;

-> END$$

Query OK, 0 rows affected (0.00 sec)


mysql> DELIMITER ;


mysql> call handlerdemo();

Query OK, 0 rows affected (0.00 sec)


mysql> select * from t;

+----+----+


| s1 | s2 |

+----+----+


| 1 | 3 |

+----+----+


1 row in set (0.00 sec)

遇到错误时,插入的新记录。


mysql> select @x;

+------+


| @x |

+------+


| 3 |

+------+


1 row in set (0.00 sec)