• MySQL教程111-MySQL定义条件和处理程序


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

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

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

    1. 定义条件

    MySQL 中可以使用 DECLARE 关键字来定义条件。其基本语法如下:

    DECLARE condition_name CONDITION FOR condition_value
    condition_value: { mysql_error_code
    | SQLSTATE [VALUE] sqlstate_value
    }

    其中:

    • 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 VALUE '42S02';
    
    //方法二:使用 mysql_error_code
    DECLARE can_not_find CONDITION FOR 1146;

    2. 定义处理程序

    MySQL 中可以使用 DECLARE 关键字来定义处理程序。其基本语法如下:

    DECLARE handler_action HANDLER
        FOR condition_value [, condition_value] ...
        statement
    
    handler_action: {
        CONTINUE | EXIT | UNDO
    }
    
    condition_value: {
        mysql_error_code | SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION
    }

    其中,handler_action 参数指明错误的处理方式,该参数有 3 个取值。这 3 个取值分别是 CONTINUE、EXIT 和 UNDO。

    • CONTINUE 表示遇到错误不进行处理,继续向下执行;
    • EXIT 表示遇到错误后马上退出;
    • UNDO 表示遇到错误后撤回之前的操作,MySQL 中暂时还不支持这种处理方式。

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

    condition_value 参数指明错误类型,该参数有 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:匹配数值类型错误代码。

    statement参数为程序语句段,表示在遇到定义的错误时,需要执行的一些存储过程或函数。

    例 2

    下面是定义处理程序的几种方式,代码如下:

    //方法一:捕获 sqlstate_value
    DECLARE CONTINUE HANDLER FOR SQLSTATE  '42S02' SET @info='CAN NOT FOUND';
    //方法二:捕获 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 FOUNDSET @info='CAN NOT FIND';
    //方法六:使用 SQLEXCEPTION
    DECLARE EXIT HANDLER FOR SQLEXCEPTION @info='ERROR';

    上述代码是 6 种定义处理程序的方法。

      1. 捕获 sqlstate_value 值。如果遇到 sqlstate_value 值为 42S02,执行 CONTINUE 操作,并且输出“CAN NOT FIND”信息。
      2. 捕获 mysql_error_code 值。如果遇到 mysql_error_code 值为 1146, 执行 CONTINUE 操作,并且输出“CAN NOT FIND”信息。
      3. 先定义条件,然后再调用条件。这里先定义 can_not_find 条件,遇到 1146 错误就执行 CONTINUE 操作。
      4. 使用 SQLWARNING。SQLWARNING 捕获所有以 01 开头的 sqlstate_value 值,然后执行 EXIT 操作,并且输出“ERROR"信息。
      5. 使用 NOT FOUND。NOT FOUND 捕获所有以 02 开头的 sqlstate_value 值,然后执行 EXIT 操作,并且输出“CAN NOT FIND”信息。
      6. 使用 SQLEXCEPTION。 SQLEXCEPTION 捕获所有没有被 SQLWARNING 或 NOT FOUND 捕获的 sqlstate_value 值,然后执行 EXIT 操作,并且输出“ERROR”信息。

    例 3

    定义条件和处理顺序,具体的执行过程如下:

    创建表t8, 如下

    mysql> create table if not exists t8
        -> (
        ->  id int (4) primary key
        -> );
    Query OK, 0 rows affected, 1 warning (1.11 sec)

    接着定义存储过程handlerdemo1, 无参

    mysql> create procedure handlerdemo1()
        ->   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;
        ->     insert into t8 values (1);
        ->   end//
    Query OK, 0 rows affected (0.55 sec)
    mysql> delimiter

    调用存储过程, 然后输出参数@X的值

    mysql> call handlerdemo1();
    Query OK, 0 rows affected (0.44 sec)
    mysql
    > select @X; +------+ | @X | +------+ | 3 | +------+ 1 row in set (0.06 sec)

    上述代码中,@X 是一个用户变量,执行结果 @X 等于 3,这表明 MySQL 执行到程序的末尾。

    如果DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1;这一行不存在,第二个 INSERT 因 PRIMARY KEY 约束而失败之后,MySQL 已经采取 EXIT 策略,且 SELECT @X 已经返回 2。如下:

    mysql> delimiter //
    mysql> create procedure handlerdemo2()
        -> begin
        ->  set @X1=1;
        ->  insert into t8 values(2);
        ->  set @X1=2;
        ->  insert into t8 values(2);
        ->  set @X1=3;
        ->  insert into t8 values(2);
        -> end//
    Query OK, 0 rows affected (0.26 sec)
    mysql> delimiter ;
    mysql> call handlerdemo2();
    ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
    mysql> select @X1;
    +------+
    | @X1  |
    +------+
    |    2 |
    +------+
    1 row in set (0.00 sec)

    可以看出, 去掉了定义的处理程序, 所以报出第二次insert t8操作的时候就会报出错误"ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'", 所以@X1的值就执行到此处的2

    注意:@X和@X1 都是表示用户变量,使用 SET 语句为其赋值,用户变量与连接有关,一个客户端定义的变量不能被其他客户端所使用,当客户端退出时,该客户端连接的所有变量将自动释放。
  • 相关阅读:
    Hive 复杂数据类型的使用
    Hive 函数之内置运算符
    Hive中Join的类型和用法
    Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)
    初步认识Hive
    Hadoop之MapReduce
    我理解中的Hadoop HDFS分布式文件系统
    Hadoop环境搭建 (伪分布式搭建)
    Hadoop(初始Hadoop)
    【数据库】MySQL 从安装到命令
  • 原文地址:https://www.cnblogs.com/no-celery/p/13565118.html
Copyright © 2020-2023  润新知