条件处理涉及到两个语句,一个是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。


引用至:

http://blog.csdn.net/rdarda/article/details/7884044