建站软件 优化软件 编程软件 网页辅助 站群程序 网站程序 图像处理 资源教程 字体下载 推荐软件


您的位置:首页 > MYSQL学习 > MySQL数据库的异常处理

MySQL数据库的异常处理

时间:2015-03-22 18:53:11  来源:免费模板网 作者:风雪 阅读次数 tagsmysql技巧

记录错误日志知道网站什么时候会报错这个对找bug是很有必要的
对于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)

 

本文地址:https://www.freemoban.com/mysql/2015/0322/1078.html

猜你喜欢
栏目推荐
模板推荐

Copyright:www.freemoban.com 免费模板网 All Rights Reserved 网站备案:辽ICP备19014872号-2   辽公网安备 21010602000376号  辽公网安备:42900402000182号

免责声明:本站部分资源来自互联网收集,版权归原创者所有,如果侵犯了你的权益,我们会及时删除侵权内容,联系QQ:1615187561 谢谢合作!