定义条件和处理程序
定义条件: 是 事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式,并且保证存储过程或函数在遇到警告或者错误时能继续执行,这样可以增强存储程序处理问题的能力,避免程序异常停止运行;
1,定义条件:(定义程序可能出现的问题的错误参数)
定义条件使用DECLARE 语句, 语法格式如下
DECLARE conditon_name CONDITION FOR [conditon_type]
[conditon_type]:
SQLSTATE [VALUE] sqlstate_value | mysql_error_code
参数说明如下:
conditon_name 表示条件的名称
conditon_type 表示条件的类型包含这两种(
sqlstate_value 和 mysql_error_code 都表示mysql 的错误)
sqlstate_value 为长度为 5 的字符串类型错误代码
mysql_error_code 为数值类型错误代码 例如 ERROR 1142(42000) 中 sqlstate_value 的值为42000, 1142是mysql_error_code
这个语句指定需要特殊处理的条件, 他将一个名字和指定的错误条件关联起来. 这个名字可以随后被用在定义处理程序的 DECLARE HANDLER 语句中
示例:
定义"ERROR 1148(42000)"错误, 名称为 command_not_allowed ,可以使用两种不同的方法定义
方法一: 使用 sqlstate_value
DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000'
方法二: 使用 mysql_error_code
DECLATE command_not_allowed CONDITION FOR 1148
2,定义处理程序:
定义处理程序语法如下(就是定义遇到错误执行的代码,前面定义的条件,在这里进行捕捉, 捕捉到之后执行相应的程序)
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type: => CONTINUE | EXIT | UNDO
condition_value:=> 下面这几种
1=>SQLSTATE [VALUE] sqlstate_value
2=>condition_name
3=>SQLWARNING
4=>NOT FOUND
5=>SQLEXCEPTION
6=>mysql_error_code
参数说明:
handler_type 有三个可选参数 CONTINUE, EXIT, UNDO
CONTINUE 表示遇到错误不处理继续执行
EXIT 表示遇到错误马上退出
UNDO 表示遇到错误后撤回之前的操作(Mysql 中暂时不支持这个操作)
condition_value 参数说明
SQLSTATE [VALUE] sqlstate_value 包含5个字符的字符串错误值
condition_name 表示 DECLARE CONDITION 定义的错误条件名称
SQLWARNING 匹配所有以 01 开头的SQLSTATE 错误代码
NOT FOUND 匹配所有以 02 开头的SQLSTATE 错误代码
SQLEXCEPTION 匹配所有没有被 SQLWARNING 和 NOT FOUND 捕获的SQLSTATE 错误代码
mysql_error_code 匹配数值类型错误代码
sp_statement 参数为程序语句短, 表示在遇到定义的错误时, 需要执行的存储过程或函数
示例如下:
方法一; 捕获 sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='NO_SUCH_TABLE';
方法二; 捕获 mysql_error_code
DECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE';
方法三; 先定义条件, 然后调用
DECLARE no_such_table CONDITION FOR 1146;
DELCARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info='NO_SUCH_TABLE';
方法四: 使用 SQLWARNING
DECLARE EXIT HANDLER FOR SQLWARING SET @info='ERROR';
方法五; 使用 NOT FOUND
DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE';
方法六; 使用 SQLEXCEPTION
DECLATE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';
第一种方法时捕获 sqlstate_value的值, 如果遇到sqlstate_value 的值为'42S02', 执行CONTINUE 操作, 并且输出"NO_SUCH_TABLE"
第二种方法是捕获mysql_error_code 值, 如果遇到mysql_error_code 的值为1146, 执行 CONTINUE 操作, 并输出"NO_SUCH_TABLE" 信息
第三种方法是先定义条件, 然后再调用条件,这里先定义 no_such_table 条件, 遇到1146 错误就执行 CONTINUE 操作
第四种方法是使用 SQLWARNING , SQLWARNING 捕获所有以 01 开头的 sqlstate_value 的值, 然后执行 EXIT 操作, 并输出 'ERROR' 信息
第五种是使用 NOT FOUND , NOT FOUND 捕获所有以 02 开头的sqlstate_value 的值, 然后执行EXIT 操作, 并输出 "NO_SUCH_TABLE" 信息
第六种 是使用 SQLEXCEPTION, SQLEXCEPTION 捕获所有没有被 NOT FOUND 或 SQLWARNING 捕获的sqlstate_value 的值, 然后执行 EXIT 操作, 并输出 "ERROR" 信息
我们看到 @x 变量在执行完成之后 的值为 3; 这表明程序执行到末尾了, 正常情况下,如果主键重复的话,第二次插入操作会 报错, 执行默认的EXIT 操作, 但是我们定义23000 号错误执行 CONTINUE 而不是退出,这样,就继续向下执行.
@x 和 @x2 是用户变量, 使用 SET 语句为其赋值, 用户变量与连接有关,一个客户端定义的变量 不能被其他客户端看到货使用, 当客户端退出, 该客户端连接的所有变量将自动释放
总结:
定义条件和处理程序是在遇到错误的时候,执行我们自己定义的处理程序, 而不是走默认的处理程序, 或者程序执行时遇到的一些问题,我们自己定义对错误的处理方法
声明处理过程可以理解为 声明一个事件, 如果这个事件被触发, 则会执行我们定义的操作
在循环光标的时候, 可能会发生越界的错误, 这个时候, 我们可以自己定义在遇到光标越界的时候执行程序是 退出 或 继续;