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

MYSQL
MySQL 5.0默认100连接数的修改
如何使用"MySQL-Proxy"实现读写分离
phpMyAdmin下载、安装和使用入门
安装phpMyAdmin数据库管理软件
关于Mysql数据库导致CPU很高的问题解决
Mysql数据库的导入导出 和 Liunx的权限
MySQL InnoDB存储引擎的一些参数
MySQL InnoDB存储引擎的事务隔离级别
MySQL中InnoDB和MyISAM类型的差别
如何在.NET中访问MySQL数据库
关于 mysql5 改密码后不能登录问题的解答
初学者必读 MySQL 数据库常见问题汇总
MySQL字符集:怎样才能保证不发生乱码
详细讲解优化MySQL数据库性能的十个参数
教你使用MySQL触发器自动更新memcache
SQL存储过程和触发不能使用USE的应对方法
MySQL怎样处理一个溢出的磁盘
MySQL出错代码含义列表解释一表通
服务器安装MySQL教程及注意事项
完美解决mysql中文乱码的问题

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 106 ::
收藏到网摘: 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)