Mysql 存储过程二三事之三

定义条件和处理程序

定义条件: 是 事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式,并且保证存储过程或函数在遇到警告或者错误时能继续执行,这样可以增强存储程序处理问题的能力,避免程序异常停止运行;

1,定义条件:(定义程序可能出现的问题的错误参数)

定义条件使用DECLARE 语句, 语法格式如下

DECLARE conditon_name CONDITION FOR [conditon_type]

[conditon_type]:

    SQLSTATE [VALUE] sqlstate_value | mysql_error_code

参数说明如下:

conditon_name  表示条件的名称

conditon_type  表示条件的类型包含这两种(

            sqlstate_value  和 mysql_error_code 都表示mysql 的错误)


sqlstate_value 为长度为 5 的字符串类型错误代码

mysql_error_code 为数值类型错误代码 例如 ERROR 1142(42000) 中 sqlstate_value 的值为42000, 1142是mysql_error_code 

这个语句指定需要特殊处理的条件, 他将一个名字和指定的错误条件关联起来. 这个名字可以随后被用在定义处理程序的 DECLARE HANDLER 语句中

示例:

定义"ERROR 1148(42000)"错误, 名称为 command_not_allowed ,可以使用两种不同的方法定义

方法一: 使用 sqlstate_value 

DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000'

方法二: 使用 mysql_error_code

DECLATE command_not_allowed CONDITION FOR 1148

2,定义处理程序:

    定义处理程序语法如下(就是定义遇到错误执行的代码,前面定义的条件,在这里进行捕捉, 捕捉到之后执行相应的程序)

    DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement

   handler_type: =>  CONTINUE | EXIT | UNDO

    condition_value:=> 下面这几种

        1=>SQLSTATE [VALUE] sqlstate_value

        2=>condition_name

        3=>SQLWARNING

        4=>NOT FOUND

        5=>SQLEXCEPTION

        6=>mysql_error_code

参数说明:

handler_type 有三个可选参数     CONTINUE,  EXIT,  UNDO

            CONTINUE 表示遇到错误不处理继续执行

            EXIT  表示遇到错误马上退出

            UNDO 表示遇到错误后撤回之前的操作(Mysql 中暂时不支持这个操作)

condition_value 参数说明

            SQLSTATE [VALUE] sqlstate_value 包含5个字符的字符串错误值

            condition_name 表示 DECLARE CONDITION 定义的错误条件名称

            SQLWARNING 匹配所有以 01 开头的SQLSTATE 错误代码

            NOT FOUND  匹配所有以 02 开头的SQLSTATE 错误代码

            SQLEXCEPTION 匹配所有没有被 SQLWARNING 和 NOT FOUND             捕获的SQLSTATE 错误代码

            mysql_error_code 匹配数值类型错误代码

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

示例如下:

方法一; 捕获 sqlstate_value

        DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='NO_SUCH_TABLE';

方法二; 捕获 mysql_error_code

        DECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE';

方法三; 先定义条件, 然后调用 

        DECLARE  no_such_table CONDITION  FOR 1146;

        DELCARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info='NO_SUCH_TABLE';

方法四: 使用 SQLWARNING

        DECLARE EXIT HANDLER FOR SQLWARING SET @info='ERROR';

方法五; 使用 NOT FOUND

        DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE';

方法六; 使用 SQLEXCEPTION

        DECLATE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';

第一种方法时捕获 sqlstate_value的值, 如果遇到sqlstate_value 的值为'42S02', 执行CONTINUE 操作, 并且输出"NO_SUCH_TABLE"

第二种方法是捕获mysql_error_code 值, 如果遇到mysql_error_code 的值为1146, 执行 CONTINUE 操作, 并输出"NO_SUCH_TABLE" 信息

第三种方法是先定义条件, 然后再调用条件,这里先定义 no_such_table 条件, 遇到1146 错误就执行  CONTINUE 操作

第四种方法是使用 SQLWARNING , SQLWARNING 捕获所有以 01 开头的 sqlstate_value 的值, 然后执行 EXIT 操作, 并输出 'ERROR' 信息

第五种是使用 NOT FOUND , NOT FOUND 捕获所有以 02 开头的sqlstate_value 的值, 然后执行EXIT 操作,  并输出  "NO_SUCH_TABLE" 信息

第六种 是使用 SQLEXCEPTION,  SQLEXCEPTION 捕获所有没有被 NOT FOUND 或 SQLWARNING  捕获的sqlstate_value 的值, 然后执行 EXIT 操作, 并输出 "ERROR" 信息


创建t2表


定义条件和处理程序

我们看到 @x 变量在执行完成之后 的值为 3; 这表明程序执行到末尾了, 正常情况下,如果主键重复的话,第二次插入操作会 报错, 执行默认的EXIT 操作, 但是我们定义23000 号错误执行 CONTINUE 而不是退出,这样,就继续向下执行. 


@x  和 @x2 是用户变量, 使用 SET 语句为其赋值, 用户变量与连接有关,一个客户端定义的变量 不能被其他客户端看到货使用,  当客户端退出, 该客户端连接的所有变量将自动释放


总结:

定义条件和处理程序是在遇到错误的时候,执行我们自己定义的处理程序, 而不是走默认的处理程序, 或者程序执行时遇到的一些问题,我们自己定义对错误的处理方法

声明处理过程可以理解为 声明一个事件, 如果这个事件被触发, 则会执行我们定义的操作

在循环光标的时候,  可能会发生越界的错误, 这个时候,  我们可以自己定义在遇到光标越界的时候执行程序是 退出 或 继续;

你可能感兴趣的:(Mysql 存储过程二三事之三)