mysql定义条件与处理程序


前言

当我们给一个非空约束的字段插入空值时,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 ;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小冯爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值