美文网首页MySQL
31-定义条件与处理程序

31-定义条件与处理程序

作者: 紫荆秋雪_文 | 来源:发表于2022-09-08 11:41 被阅读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

这样就不会报错

相关文章

  • 31-定义条件与处理程序

    一、说明 定义条件是事先定义程序执行过程中可能遇到的问题处理程序定义了在遇到问题时应当采取的处理方式,并且保证存储...

  • MySQL存储过程(续)

    定义条件和处理程序 定义条件和处理程序是事先定义程序执行过程中可能遇到的问题。并且可以在处理程序中定义解决这些问题...

  • 存储过程的使用(四)-- 使用DECLARE 定义条件和处理程序

    定义条件和处理程序是事先定义程序执行过程中可能遇到的问题,并且可以在处理程序中定义解决这些问题的办法,可以简单理解...

  • 程序编译过程

    程序编译过程 预处理主要是处理以“#”号开头的命令,包括宏定义、文件包含、条件编译。 编译的时候会检测语法、函数、...

  • C语言——预处理基本知识

    预处理是C语言特有的功能,如:宏定义、条件编译等等,好处嘛,很多,如程序可读性好、便于修改以及移植与调试等,好处这...

  • C语言23 终极篇 预处理之宏定义、条件编译和文件包含

    C语言23 终极篇 预处理之宏定义、条件编译和文件包含 什么是预处理 预处理一般是指在程序源代码被转换为二进制代码...

  • C语言内存分区

    运行之前 编译一个C程序会经历下面几个阶段: 预处理:宏定义展开,头文件展开,条件编译(#ifdef之类),不检查...

  • #define定义的宏和const定义的常量有什么区别?

    define定义的宏指令,程序是在预处理阶段将#define定义的宏与内容进行替换,因此在程序运行时,内存的常量区...

  • Flink 批处理算子详解

    批处理程序的结果 获取运行时 添加Source 定义算子转换函数 定义Sink 启动程序 source 定义 //...

  • 宏定义 预处理指令

    C语言提供的预处理指令主要有:宏定义、文件包含、条件编译 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理...

网友评论

    本文标题:31-定义条件与处理程序

    本文链接:https://www.haomeiwen.com/subject/vkxonrtx.html