查看: 4481|回复: 7

MySQL例外处理解说

[复制链接]
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
跳转到指定楼层
1#
发表于 2007-12-11 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于MySQL的例外处理测试:

USE TEST;
                                                                                                                                                                       
CREATE TABLE `eugene` (
  `ID` int(11) NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312;
                                                                                                                                                                       
delimiter $$
DROP PROCEDURE IF EXISTS `test`.`handlerdemo`$$
CREATE PROCEDURE handlerdemo ()
BEGIN  
        DECLARE X2 INT;
        DECLARE CONTINUE HANDLER FOR SQLWARNING       SET X2= 1;
        DECLARE CONTINUE HANDLER FOR NOT FOUND             SET X2 = 2;
        DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'    SET X2= 3;
        DECLARE CONTINUE HANDLER FOR SQLEXCEPTION     SET X2 = 4;
        INSERT INTO  eugene  VALUES (1);
        INSERT INTO  eugene  VALUES (2);
        INSERT INTO  eugene  VALUES (2);
        SELECT X2;
END;
$$
                                                                                                                                                                       
执行完上面的代码后,你可以反复执行:
CALL handlerdemo ()
看显示的结果是什么?
第一次运行,肯定为 NULL;
第二次运行,肯定为 3;
                                                                                                                                                               
然后再修改存储过程,把存储过程中的代码:DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'    SET X2= 3;注释掉,在之前的基础上再次执行:
CALL handlerdemo ()
发现运行后的结果为 4;

剩下的SQLWARNING,NOT FOUND也类似,下面介绍下各自发挥的作用:
SQLWARNING是对所有以01开头的SQLSTATE代码的速记。(这个我自己的存储过程中还没用到过)
NOT FOUND是对所有以02开头的SQLSTATE代码的速记。(例如:游标产生的SQLSTATE=02000)
SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。(相当于Oracle中写例外处理的when ….else 中的else作用)。
SQLSTATE-----就是触发的错误代码编号,示例中的23000表示,当向eugene表中主键写入重复的值的时候,将会引发一个语法错误,错误编码就是23000,这个时候就会执行其后的语句:SET X2= 3。

官网上的语法:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
                                                                               
handler_type:
    CONTINUE
  | EXIT
  | UNDO
                                                                               
condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION
  | mysql_error_code
论坛徽章:
0
2#
发表于 2007-12-11 17:42 | 只看该作者

支持

以上分析很详细,都看明白,有收获!

使用道具 举报

回复
论坛徽章:
2
3#
发表于 2008-3-10 09:36 | 只看该作者
老版,问两个问题:

1. 我不明白为什么第一次运行结果会是NULL,你这不是有插入2次值为2的记录吗?!我认为第一次就应该是3了。

2. 怎么看sqlstate?我输入show sqlstate;没用。

谢谢!

手册我看了,里面还有个这个

DECLARE condition_name CONDITION FOR condition_value

condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | mysql_error_code

老版没贴出来。

:)

使用道具 举报

回复
论坛徽章:
2
4#
发表于 2008-3-11 08:39 | 只看该作者
老版大帅哥你在哪里啊?!

使用道具 举报

回复
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
5#
 楼主| 发表于 2008-3-11 09:05 | 只看该作者
我在上海......


INSERT INTO  eugene  VALUES (2); 是的....可能是我为了测试的时候特意多写进去了...没太在意...
呵呵

使用道具 举报

回复
论坛徽章:
2
6#
发表于 2008-3-11 09:42 | 只看该作者

使用道具 举报

回复
论坛徽章:
3
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:56:44
7#
发表于 2010-10-27 11:17 | 只看该作者
java 书籍转让

使用道具 举报

回复
论坛徽章:
10
2011新春纪念徽章
日期:2011-02-18 11:43:362013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15双黄蛋
日期:2012-04-18 13:03:23蛋疼蛋
日期:2012-02-14 09:01:14复活蛋
日期:2012-02-01 10:04:16双黄蛋
日期:2012-01-16 14:47:262012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26优秀写手
日期:2013-12-18 09:29:12
8#
发表于 2010-10-28 15:10 | 只看该作者
mysql-5.1.50/Docs/mysql.info文件中有所有 错误码的映射

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表