zoukankan      html  css  js  c++  java
  • 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 语句为其赋值,用户变量与连接有关,一个客户端定义的变量不能被其他客户端所使用,当客户端退出时,该客户端连接的所有变量将自动释放。
  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/no-celery/p/13565118.html
Copyright © 2011-2022 走看看