在程序的运行过程中可能会遇到问题,此时我们可以通过定义条件和处理程序来事先定义这些问题。

定义条件是指事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式和解决办法,保证存储过程和函数在遇到警告或错误时能继续执行,从而增强程序处理问题的能力,避免程序出现异常被停止执行。

下面将详细讲解如何定义条件和处理程序。

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 个取值。这 3 个取值分别是 CONTINUE、EXIT 和 UNDO。

CONTINUE 表示遇到错误不进行处理,继续向下执行;

EXIT 表示遇到错误后马上退出;

UNDO 表示遇到错误后撤回之前的操作,MySQL 中暂时还不支持这种处理方式。

注意:通常情况下,执行过程中遇到错误应该立刻停止执行下面的语句,并且撤回前面的操作。但是,MySQL 中现在还不能支持 UNDO 操作。因此,遇到错误时最好执行 EXIT 操作。如果事先能够预测错误类型,并且进行相应的处理,那么可以执行 CONTINUE 操作。

参数指明错误类型,该参数有 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 语句为其赋值,用户变量与连接有关,一个客户端定义的变量不能被其他客户端所使用,当客户端退出时,该客户端连接的所有变量将自动释放。

mysql定义条件和处理_MySQL定义条件和处理程序相关推荐

  1. mysql按某列计数_Mysql按条件计数的几种方法

    最近在给某网站的后台添加一系列的统计功能,遇到很多需要按条件计数的情况.尝试了几种方法,下面简要记录,供大家参考. 问题描述 为使讨论简单易懂,我将问题稍作简化,去掉诸多的背景. 从前有一个皇帝,他有 ...

  2. mysql的条件求和函数_mysql 带条件取count记录数,SUM()函数按条件求和

    在做统计报表的时候,通常会用到一些复杂的统计功能,而不是简单的 count(*), sum(abc) 就可以的,这就用到了一些基于条件的统计功能. 带条件取count记录数 参考方法: 统计sub_t ...

  3. mysql中where条件判断语句_MySQL Where 条件语句介绍和运算符小结

    WHERE 条件 有时候操作数据库时,只操作一些有条件限制的数据,这时可以在SQL语句中添加WHERE子句来规定数据操作的条件. 语法: SELECT column,- FROM tb_name WH ...

  4. mysql中的逻辑类型如何定义_MYSQL存储过程即常用逻辑知识点总结

    Mysql存储过程 1.创建存储过程语法(格式) DELIMITER $ CREATE PROCEDURE 存储过程名A(IN 传入参数名a INT,IN 传入参数名b VARCHAR(20),OUT ...

  5. mysql表定义外键语法_mysql设置外键的语法怎么写?

    2012-08-31 回答 mysql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个: 一个是让数据库自己通过外键来保证数据的完整性和一致性 一个就是能够增加er图的可读性 有些人认为外键 ...

  6. MySQL中外键定义级展现结果_MySQL高频面试60题含答案

    在Java技术面试中,高频常问到的一些MySQL面试题,整理分享给大家,既可用来准备技术面试,也可以作为MySQL知识点梳理.温顾而知新.建议了解.收藏备用. Mysql中有哪几种锁? 1.表级锁:开 ...

  7. mysql异常处理_MySQL定义异常和异常处理方法

    在MySQL中,特定异常需要特定处理.这些异常可以联系到错误,以及子程序中的一般流程控制.定义异常是事先定义程序执行过程中遇到的问题,异常处理定义了在遇到问题时对应当采取的处理方式,并且保证存储过程或 ...

  8. 条件随机场(CRF) - 2 - 定义和形式

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xueyingxue001/article/details/51498968 声明: 1,本篇为个人对 ...

  9. mysql触发器新元组_MySQL触发器-条件触发器语法

    文章为作者原创,未经许可,禁止转载.    -Sun Yat-sen University 冯兴伟 实验4触发器 (1)实验目的 掌握数据库触发器的设计和使用方法 (2)实验内容和要求 定义BEFOR ...

最新文章

  1. 如何在 1 秒内将 50 个 OpenCV 帧上传到云存储
  2. JWT: 基于Token的验证
  3. 用 Scikit-Learn 和 Pandas 学习线性回归
  4. [云炬创业学笔记]第二章决定成为创业者测试9
  5. spring自定义作用域 依赖注入之手动注入
  6. 国产嵌入式操作系统发展思考
  7. 幻想和欲望毁了多少苦命的人(修改增加版)
  8. 档案信息化管理的最好解决方案
  9. Redis 如何处理已经过期的数据?
  10. Java当中的异常处理
  11. MOS管的源极和漏极的区别
  12. 超级右键-Mac右键扩展工具
  13. 怎么利用pytorch训练好的模型测试单张图片
  14. 拓展——RGB颜色查询对照表
  15. 用二次函数研究三次多项式函数的零点问题【中阶和高阶辅导】
  16. 25款经典老芯片,认识5款以上的工程师证明你老了!
  17. 常见Android面试题整理
  18. 男人的累,男人的泪…………
  19. python在哪下载安装,python软件在哪下载
  20. 智能|智能仓储就是无人仓库吗?正确理解很重要

热门文章

  1. 机器都会学习了,你的神经网络还跑不动?来看看这些建议
  2. 操作系统学习笔记 第四章:存储器管理(王道考研)
  3. MLIR与Code Generation
  4. Python数据挖掘1:创建一位数组和二维数组,取最大最小值,切片
  5. 查看Ubuntu 系统的版本
  6. ERROR: Failed to resolve: com.android.databinding:library:3.4.2
  7. Object.defineProperty()
  8. python之路-day11-迭代器闭包
  9. canvas绘制的文字如何换行
  10. Oracle数据库导入导出命令!