31-定义条件与处理程序
2022-09-08 本文已影响0人
紫荆秋雪_文
一、说明
定义条件
是事先定义程序执行过程中可能遇到的问题
处理程序
定义了在遇到问题时应当采取的处理方式,并且保证存储过程或函数在遇到警告或错误时能继续执行。这样可以增强存储程序处理问题的能力,避免程序异常停止运行
二、应用而生
DELIMITER $
CREATE PROCEDURE updatedatanocondition()
BEGIN
SET @x = 1;
UPDATE employees SET email = NULL WHERE last_name = 'Abel';
SET @x = 2;
UPDATE employees SET email = 'aaa' WHERE last_name = 'Abel';
SET @x = 3;
END $
DELIMITER ;
- 调用
CALL updatedatanocondition();
报错.png
[23000][1048] Column 'email' cannot be null
- 输出会话变量
SELECT @x;
// @x=1
- 调用 updatedatanocondition 报错后无法定位错误位置,需要通过使用定义变量(@x)的方式来一步一步排查
三、定义条件
定义条件就是给 MySQL 中的错误码命名,这有助于存储的程序更清晰。它将一个
错误名字
和指定的错误条件
关联起来。这个名字可以随后被用在定义处理程序的DECLARE HANDLER
语句中
1、定义条件语句
DECLARE `错误名称` CONDITION FOR 错误码(错误条件)
- 错误码说明:
-
MySQL_error_code
:是数值类型错误代码 -
sqlstate_value
:是长度为5的字符串类型错误代码 - eg:在ERROR 1418 (HY000)中,1418是MySQL_error_code,'HY000'是sqlstate_value。
-
2、实战
- 定义“Field_Not_Be_NULL”错误名与MySQL中违反非空约束的错误类型是“ERROR 1048 (23000)”对
应 使用 MySQL_error_code
DECLARE Field_Not_Be_NULL CONDITION FOR 1048;
使用 sqlstate_value
DECLARE Field_Not_Be_NULL CONDITION FOR SQLSTATE '23000';
四、定义处理程序
为 SQL 执行过程中发生的某种类型的错误定义特殊的处理程序
1、语句定义
DECLARE 处理方式 HANDLER FOR 错误类型 处理语句
处理方式
-
CONTINUE
:表示遇到错误不处理,继续执行 -
EXIT
:表示遇到错误马上退出 -
UNDO
:表示遇到错误后撤回之前的操作。MySQL中暂时不支持
这样的操作
错误类型:
-
SQLSTATE '字符串错误码'
:表示遇长度为5的sqlstate_value类型的错误代码 -
MySQL_error_code
:匹配数值类型错误代码 -
错误名称
:表示DECLARE ... CONDITION
定义的错误条件名称 -
SQLWARNING
:匹配所有以01开头的SQLSTATE错误代码 -
NOT FOUND
:匹配所有以02开头的SQLSTATE错误代码 -
SQLEXCEPTION
:匹配所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE错误代码;
处理语句:
如果出现上述条件之一,则采用对应的处理方式,并执行指定的处理语句。语句可以是
像SET 变量 = 值
这样的简单语句,也可以是使用BEGIN ... END
编写的复合语句
定义处理程序的方式
#方法1:捕获sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info = 'NO_SUCH_TABLE';
#方法2:捕获mysql_error_value
DECLARE CONTINUE HANDLER FOR 1146 SET @info = 'NO_SUCH_TABLE';
#方法3:先定义条件,再调用
DECLARE no_such_table CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info = 'NO_SUCH_TABLE';
#方法4:使用SQLWARNING
DECLARE EXIT HANDLER FOR SQLWARNING SET @info = 'ERROR';
#方法5:使用NOT FOUND
DECLARE EXIT HANDLER FOR NOT FOUND SET @info = 'NO_SUCH_TABLE';
#方法6:使用SQLEXCEPTION
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info = 'ERROR';
实战
DELIMITER $
CREATE PROCEDURE updatedatanocondition2()
BEGIN
# 定义处理语句
DECLARE CONTINUE HANDLER FOR 1048 SET @pro = -1;
SET @x = 1;
UPDATE employees SET email = NULL WHERE last_name = 'Abel';
SET @x = 2;
UPDATE employees SET email = 'aaa' WHERE last_name = 'Abel';
SET @x = 3;
END $
DELIMITER ;
- 调用
CALL updatedatanocondition2();
- 查看
SELECT @x , @pro;
image.png
这样就不会报错