设为首页 收藏本站
查看: 1056|回复: 0

[经验分享] MySQL中级:条件处理(错误、异常处理)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-16 10:18:58 | 显示全部楼层 |阅读模式
条件处理涉及到两个语句,一个是DECLARE...CONDITION,另一个是DECLARE....HANDLER。先来看看DECLARE....HANDLER。

1、DECLARE....HANDLER语句

    这个语句用于但数据库出现某种情况的时候(condition,大部分指发生某种错误时),来定义具体的处理办法(handler);所以这里涉及到包括:

    出现什么情况;

    如何处理它;
   
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

这里面需要注意几点:

    condition_value [,condition_value],这个的话说明可以包括多种情况(方括弧表示可选的),也就是一个handler可以定义成针对多种情况进行相应的操作;另外condition_value可以包括的值有上面列出来的6种:

    1、mysql_error_code,这个表示mysql的错误代码,错误代码是一个数字,完成是由mysql自己定义的,这个值可以参考mysql数据库错误代码及信息。


    2、SQLSTATE [VALUE] sqlstate_value,这个同错误代码类似形成一一对应的关系,它是一个5个字符组成的字符串,关键的地方是它从ANSI SQL和ODBC这些标准中引用过来的,因此更加标准化,而不像上面的error_code完全是mysql自己定义给自己用的,这个和第一个类似也可以参考mysql数据库错误代码及信息。


    3、condtion_name,这个是条件名称,它使用DECLARE...CONDITION语句来定义,这个后面我们会介绍如何定义自己的condition_name。


    4、SQLWARNING,表示SQLSTATE中的字符串以‘01’起始的那些错误,比如Error: 1311 SQLSTATE:01000 (ER_SP_UNINIT_VAR)


    5、NOT FOUND,表示SQLSTATE中的字符串以‘02’起始的那些错误,比如Error: 1329 SQLSTATE: 02000(ER_SP_FETCH_NO_DATA),其实这个错误就是用在我们介绍游标的那个问题所出现的情况,也就是没有fetch到记录,也就是我们游标到记录结尾的情况。


    6、SQLEXCEPTION,表示SQLSTATE中的字符串不是以'00'、'01'、'02' 起始的那些错误,这里'00'起始的SQLSTATE其实表示的是成功执行而不是错误,另外两个就是上面的4和5的两种情况。


    上面的6种情况其实可以分为两类,一类就是比较明确的处理,就是对指定的错误情况进行处理,包括1、2、3这三种方式;另一类是对对应类型的错误的处理,就是对某一群错误的处理,包括4、5、6这三种方式。这个是介绍了condition_value。

    另外还要注意的一个内容是MySQL在默认情况下(也就是我们没有定义处理错误的方法-handler)自己的错误处理机制:1、对于SQLWARNING和NOT FOUND的处理方法就是无视错误继续执行,所以在游标的例子里面如果我们没有对repeat的条件判断的那个值做个no_more_products=1的handler来处理,那么循环就会一直下去。2、对于SQLEXCEPTION的话,其默认的处理方法是在出现错误的地方就终止掉了。


    statement,这个比较简单就是当出现某种条件/错误时,我们要执行的语句,可以是简单的如 SET  var = value这样的简单的语句,也可以是复杂的多行的语句,多行的话可以使用BEGIN  .....  END这里把语句包括在里面(注意到我们的存储过程也是多行的,所以也要BEGIN .... END)。

    handler_type,这个表示当执行完上面的statement后,希望执行怎样的动作,这里包括CONTINUE、EXIT、UNDO,表示继续、退出、撤销(暂时不支持)。这边就是两种动作,其实这两种动作在上面也说过了,CONTINUE就是一个是SQLWARNING和NOT FOUND的默认处理方法,而EXIT就是SQLEXCEPTION的默认处理方法。

       对一个CONTINUE处理程序,当前子程序的执行在执行 处理程序语句之后继续。对于EXIT处理程序,当前BEGIN...END复合语句的执行被终止。UNDO 处理程序类型语句还不被支持。


2、DECLARE...CONDITION语句
    这个语句其实是为了让我们的错误条件更加的清晰明了化的,对于上面的情况,像SQLSTATE '23000'这种表示是一种很不直观的方法,要通过相应的文档去对应,阅读起来比较不方便。
   
DECLARE condition_name CONDITION FOR condition_value
  
condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | mysql_error_code

它将一个名字和指定的错误条件关联起来。这个名字可以随后被用在DECLARE HANDLER语句中。

这样看起来还是不知道它有什么作用,来看一个例子就明白了:
   
-- 把duplicate_key 与 SQLSTATE '23000'这个错误条件关联起来
DECLARE duplicate_key CONDITION FOR SQLSTATE '23000';

DECLARE CONTINUE HANDLER FOR duplicate_key
  BEGIN
    -- body of handler
  END;

    这里我们用duplicate_key这个条件名称来对应到SQLSTATE '23000'上面,这样查看起来更加的直观。这时duplicate_key就是我们上面介绍DECLARE....HANDLER时候的那个condition_name。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-22184-1-1.html 上篇帖子: mysql用户管理--密码管理 下篇帖子: php数组函数小结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表