14-定义条件和处理程序
9.4.6 定义条件和处理程序
在程序的运行过程中可能会遇到问题,可以使用定义条件和处理程序来事先定义这些问题,并且可以在处理程序中定义在遇到这些问题时应该采用什么样的处理方式,提出解决方法,保证存储过程或自定义函数在遇到警告或错误时能够继续执行,从而增强程处理问题的能力,避免程序异常被停止执行。在MySQL中,使用DECLARE关键字来定义条件和处理程序。
1.定义条件
DECLARE condition_name CONDITION FOR condition_value condition_value: SQLSTATE [VALUE] sqlstate_value | mysql_error_code
其中,condition_name参数为条件的名称;condition_value参数为条件的类型;sqlstate_value和mysql_error_code都可以表示MYSQL的错误,sqlstate_value为长度为5的字符串类型的错误代码,mysql_error_code为数值类型错误代码。
【范例9-26】
定义ERROR 1120(43000)错误的名称为command_not_find,有两种方法可以实现。
方法1:使用sqlstate_value。
Declare command_not_find CONDITION FOR sqlstate '43000';
方法2:使用mysql_error_code。
DECLARE command_not_find CONDITION FOR 1120;
2.定义处理程序
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
其中,handler_type表示CONTINUE | EXIT | UNDO语句中的handler_type为错误处理的方式,取以下3个值中的一个。
⑴CONTINUE表示遇到错误不处理,继续执行。
⑵EXIT表示遇到错误马上退出。
⑶UNDO表示遇到错误后撤销之前的操作。
condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
语法中的condition_value表示错误的类型,该参数可以有以下的取值。
⑴SQLSTATE [VALUE] sqlstate_value:字符串错误值。
⑵condition_name:使用declare condition定义的错误条件名称。
⑶SQLWARNING:匹配所有以01开头的SQLSTATE错误代码。
⑷NOT FOUND 匹配所有以02开头的SQLSTATE错误代码。
⑸SQLEXCEPTION匹配所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATEC错误代码。
【范例9-27】
以下是定义处理程序的几种方式,代码如下。
⑴DECLARE CONTINUE HANDLER FOR SQLSTATE '23S00' SET @x=20;
该方法是定义捕获sqlstate_value值。如果遇到sqlstate_value值为23S00,执行CONTINUE操作,并且给变量x赋值为2。
⑵DECLARE CONTINUE HANDLER FOR 1146 SET SET @x=20;
该方法捕获mysql_error_code值。如果mysql_error_code值为1146,执行CONTINUE操作,并且给变量x赋值为2。
⑶DECLARE NO_TABLE CONDITION FOR 1150; DECLARE CONTINUE HANDLER FOR NO_TABLE SET @info=›NO_TABLE›;
先定义NO_TABLE条件,遇到1150错误就执行CONTINUE操作,并输出“NO_TABLE”信息。
⑷DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';
SQLWARNING捕获所有以01开头的sqlstate_value值,然后执行EXIT操作,并且输出“ERROR”信息。
⑸DECLARE EXIT HANDLER FOR NOT FOUND SET @info='ERROR';
NOT FOUND捕获所有以02开头的sqlstate_value值,然后执行EXIT操作,并且输出“ERROR"信息。
⑹DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';
SQLEXCEPTION捕获所有没有被SQLWARNING或NOT FOUND捕获的sqlstate_value值,然后执行EXIT操作,并且输出"ERROR"信息。