美文网首页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-定义条件与处理程序

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