文章目录
- 前言
- 定义条件
- 定义处理程序
- 案例
前言
当我们给一个非空约束的字段插入空值时,MySQL数据库就会抛出错误,如果该语句在存储过程中,则会退出不再向下继续执行。
ERROR 1048 (23000): Column 'sal' cannot be null
定义条件
定义条件就是给MySQL中的错误码(1048)命名,这有助于存储的程序代码更清晰。它将错误名字和错误条件关联起来。这个名字可以随后被用在定义处理程序的DECLARE HANDLE
语句中。
DECLARE 错误名称 CONDITION FOR 错误码(或错误条件)
错误码:
上述例子中1048是MySQL_error_code
,23000是 sqlstate_value
。两者都可以表示错误代码,不过1048是数值类型,23000是5位的字符串,使用时要注意。
DECLARE Field_Not_Be_NULL CONDITION FOR 1048;
DECLARE Field_Not_Be_NULL CONDITION FOR SQLSTATE '23000'; #加上SQLSTATE否则23000会隐式转换为整型
注意DECLARE是局部变量定义,要在begin…end内使用
定义处理程序
可以为SQL执行过程中发生的某种类型的错误定义特殊的处理程序。定义处理程序时,使用DECLARE语句 的语法如下:
DECLARE 处理方式 HANDLER FOR 错误类型 处理语句;
处理方式:处理方式有3个取值:CONTINUE、EXIT、UNDO。
-
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 编写的复合语句。
例子
#捕获sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info = 'NO_SUCH_TABLE'
遇到错误代码sqlstate_value’42502’后,将输出信息换成NO_SUCH_TABLE,并CONTINUE。
案例
CREATE PROCEDURE InsertDataWithCondition()
BEGIN
DECLARE duplicate_entry CONDITION FOR SQLSTATE '23000' ;
DECLARE EXIT HANDLER FOR duplicate_entry SET @proc_value = -1;
SET @num1 = 1;
INSERT INTO depts(dname) VALUES('测试');
SET @num2 = 2;
INSERT INTO depts(dname) VALUES('测试');
SET @num3 = 3;
END ;