您的位置:首页 > 数据库 > MySQL

MySql错误处理(二) - Condition & Handle

2011-04-01 11:46 260 查看

20.2.10.条件和处理程序

20.2.10.1.DECLARE条件

20.2.10.2.DECLARE处理程序

特定条件需要特定处理。这些条件可以联系到错误,以及子程序中的一般流程控制。

20.2.10.1.DECLARE条件

DECLAREcondition_nameCONDITIONFORcondition_value
condition_value:
SQLSTATE[VALUE]sqlstate_value
|mysql_error_code
这个语句指定需要特殊处理的条件。它将一个名字和指定的错误条件关联起来。这个名字可以随后被用在DECLAREHANDLER语句中。请参阅20.2.10.2节,“DECLARE处理程序”。

除了SQLSTATE值,也支持MySQL错误代码。

20.2.10.2.DECLARE处理程序

DECLAREhandler_typeHANDLERFORcondition_value[,...]sp_statement
handler_type:
CONTINUE
|EXIT
|UNDO
condition_value:
SQLSTATE[VALUE]sqlstate_value
|condition_name
|SQLWARNING
|NOTFOUND
|SQLEXCEPTION
|mysql_error_code
这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,指定的语句被执行。

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

·SQLWARNING是对所有以01开头的SQLSTATE代码的速记。

·NOTFOUND是对所有以02开头的SQLSTATE代码的速记。

·SQLEXCEPTION是对所有没有被SQLWARNING或NOTFOUND捕获的SQLSTATE代码的速记。

除了SQLSTATE值,MySQL错误代码也不被支持。

例如:

mysql>CREATETABLEtest.t(s1int,primarykey(s1));
QueryOK,0rowsaffected(0.00sec)
mysql>delimiter//
mysql>CREATEPROCEDUREhandlerdemo()
->BEGIN
->DECLARECONTINUEHANDLERFORSQLSTATE'23000'SET@x2=1;
->SET@x=1;
->INSERTINTOtest.tVALUES(1);
->SET@x=2;
->INSERTINTOtest.tVALUES(1);
->SET@x=3;
->END;
->//
QueryOK,0rowsaffected(0.00sec)
mysql>CALLhandlerdemo()//
QueryOK,0rowsaffected(0.00sec)
mysql>SELECT@x//
+------+
|@x|
+------+
|3|
+------+
1rowinset(0.00sec)
注意到,@x是3,这表明MySQL被执行到程序的末尾。如果DECLARECONTINUEHANDLERFORSQLSTATE'23000'SET@x2=1;这一行不在,第二个INSERT因PRIMARYKEY强制而失败之后,MySQL可能已经采取默认(EXIT)路径,并且SELECT@x可能已经返回2。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: