MySQL中条件与处理程序的定义及使用方法
时间:2026-08-17 | 作者:风起客 | 阅读:0程序运行时,难免会碰到各种问题。与其等出错了再临时处理,不如提前把这些情况和应对方式定义好。
所谓定义条件,就是把程序执行过程中可能遇到的问题先标识出来。处理程序,则是为这些问题预先安排好处理动作。
这样一来,存储过程和函数在遇到警告或错误时,就不至于轻易中断,而是能够按照既定方式继续执行,从而提升程序处理异常的能力,尽量避免执行过程中被意外打断。
下面按顺序说明,MySQL 中如何定义条件和处理程序。
1. 定义条件
在 MySQL 中,可以通过 DECLARE 关键字定义条件。基本语法如下:
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 是数值类型错误代码。例如在 ERROR 1146(42S02) 中,sqlstate_value 的值是 42S02,mysql_error_code 的值是 1146。
例 1
下面把 “ERROR 1146 (42S02)” 这个错误定义为 can_not_find。这个定义有两种写法,代码如下:
//方法一:使用sqlstate_value DECLARE can_not_find CONDITION FOR SQLSTATE '42S02'; //方法二:使用 mysql_error_code DECLARE can_not_find CONDITION FOR 1146;
2. 定义处理程序
在 MySQL 中,同样可以使用 DECLARE 关键字来定义处理程序。其基本语法如下:
DECLARE handler_type HANDLER FOR condition_value[...] sp_statement handler_type: CONTINUE | EXIT | UNDO condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
这里的 handler_type 参数,用来指定错误出现后的处理方式。它有 3 个取值:CONTINUE、EXIT 和 UNDO。
- CONTINUE 表示遇到错误时不终止,继续向下执行;
- EXIT 表示一旦遇到错误,立即退出;
- UNDO 表示遇到错误后撤销之前的操作,不过 MySQL 目前还不支持这种处理方式。
注意:一般来说,执行过程中一旦出现错误,后续语句通常就不该继续执行,前面的操作也应当撤回。
但问题在于,MySQL 目前并不支持 UNDO。因此,更稳妥的做法往往是使用 EXIT。如果错误类型能够提前预判,而且也准备好了对应处理逻辑,那么就可以使用 CONTINUE。
condition_value 的 6 种取值
用于指明错误类型的参数,一共有 6 种取值:
- sqlstate_value:5 个字符组成的字符串错误值;
- condition_name:表示通过 DECLARE 定义的错误条件名称;
- SQLWARNING:匹配所有以 01 开头的 sqlstate_value 值;
- NOT FOUND:匹配所有以 02 开头的 sqlstate_value 值;
- SQLEXCEPTION:匹配所有未被 SQLWARNING 或 NOT FOUND 捕获的 sqlstate_value 值;
- mysql_error_code:匹配数值类型错误代码。
sp_statement 参数表示程序语句段。也就是当命中已定义错误时,需要执行的一些存储过程或函数语句。
例 2
下面列出几种定义处理程序的方式,代码如下:
//方法一:捕获 sqlstate_value DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='CAN NOT FIND'; //方法二:捕获 mysql_error_code DECLARE CONTINUE HANDLER FOR 1146 SET @info='CAN NOT FIND'; //方法三:先定义条件,然后调用 DECLARE can_not_find CONDITION FOR 1146; DECLARE CONTINUE HANDLER FOR can_not_find SET @info='CAN NOT FIND'; //方法四:使用 SQLWARNING DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR'; //方法五:使用 NOT FOUND DECLARE EXIT HANDLER FOR NOT FOUND SET @info='CAN NOT FIND'; //方法六:使用 SQLEXCEPTION DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';
上面这段代码,一共展示了 6 种定义处理程序的方法。
- 捕获 sqlstate_value 值。只要遇到 sqlstate_value 为 42S02,就执行 CONTINUE,并输出 “CAN NOT FIND” 信息。
- 捕获 mysql_error_code 值。只要遇到 mysql_error_code 为 1146,就执行 CONTINUE,并输出 “CAN NOT FIND” 信息。
- 先定义条件,再通过条件名调用。这里先定义 can_not_find 条件,遇到 1146 错误时执行 CONTINUE。
- 使用 SQLWARNING。SQLWARNING 会捕获所有以 01 开头的 sqlstate_value 值,然后执行 EXIT,并输出 “ERROR" 信息。
- 使用 NOT FOUND。NOT FOUND 会捕获所有以 02 开头的 sqlstate_value 值,然后执行 EXIT,并输出 “CAN NOT FIND” 信息。
- 使用 SQLEXCEPTION。SQLEXCEPTION 会捕获所有没有被 SQLWARNING 或 NOT FOUND 捕获的 sqlstate_value 值,然后执行 EXIT,并输出 “ERROR” 信息。
例 3
下面来看定义条件和处理顺序的执行过程,具体如下:
mysql> CREATE TABLE t8(s1 INT,PRIMARY KEY(s1));
Query OK, 0 rows affected (0.07 sec)
mysql> DELIMITER //
mysql> CREATE PROCEDURE handlerdemo()
-> BEGIN
-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1;
-> SET @X=1;
-> INSERT INTO t8 VALUES(1);
-> SET @X=2;
-> INSERT INTO t8 VALUES(1);
-> SET @X=3;
-> END //
Query OK, 0 rows affected (0.02 sec)
mysql> DELIMITER ;
mysql> CALL handlerdemo();
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT @X;
+------+
| @X |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
在这段代码里,@X 是用户变量。执行结果中 @X 等于 3,这说明 MySQL 的确一路执行到了程序末尾。
如果DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1;这一行不存在,那么第二个 INSERT 在因 PRIMARY KEY 约束失败后,MySQL 很可能就会直接采用 EXIT 策略,此时 SELECT @X 返回的结果就可能是 2。
注意:@X 表示用户变量,可以通过 SET 语句为它赋值。
- 用户变量与连接相关;
- 一个客户端定义的变量不能被其他客户端使用;
- 当客户端退出时,该连接创建的所有变量都会被自动释放。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 迅捷路由器怎么调信号最强,设置时要注意什么?
- 时间:2026-08-27
-
- vivo浏览器怎么卸不掉?原因和解决方法在这里
- 时间:2026-08-27
-
- OPPO R11s黑屏了,怎么强制恢复出厂设置?
- 时间:2026-08-27
-
- 飞利浦显示器包装盒有生产日期和保修期吗?怎么看?
- 时间:2026-08-27
-
- 联想新平板开机必须联网吗?怎么做?
- 时间:2026-08-27
-
- 平板横竖屏切换设置与问题解决
- 时间:2026-08-27
-
- 移动电源容量怎么测?要准备哪些工具?
- 时间:2026-08-27
-
- 荣耀90 Pro防水吗?防水级别多少?怎么用才安全
- 时间:2026-08-27
精选合集
更多大家都在玩
大家都在看
更多-
- 以下哪种食材被称为“地下苹果” 蚂蚁庄园今日答案9.18
- 时间:2026-09-17
-
- 蚂蚁庄园今天答题答案2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园答题今日答案2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园小课堂2026年9月18日最新题目答案
- 时间:2026-09-17
-
- 小鸡答题今天的答案是什么2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园每日答题答案2026年9月18日
- 时间:2026-09-17
-
- 蔬菜洗完掉色,说明是被染色了,是真的吗 蚂蚁庄园今日答案9月18日
- 时间:2026-09-17
-
- 满襟蜡绘花纹巧染就花纹当绣裳说的是哪种传统技艺 蚂蚁新村今日答案2026.9.17
- 时间:2026-09-17
