Mysql Condition(情况)处理

       在Java中可以通过Exception、throw等实现异常处理,在Mysql存储过程中同样存在类似的一套机制,不过在Mysql中是通过CONDITION来定义异常情况,通过HANDLER来处理CONDITION,以下为详细的语法。

       在存储程序执行期间可能出现需要特殊处理的情况,例如退出当前程序块或继续执行。可以为一般情况(如警告或异常)或特定情况(如特定的错误代码)定义处理程序。特定条件可以在处理程序中指定名称并以这种方式引用。

一、DECLARE ... CONDITION 语句

DECLARE condition_name CONDITION FOR condition_value

condition_value: {
    mysql_error_code
  | SQLSTATE [VALUE] sqlstate_value
}

       DECLARE ... CONDITION语句声明命名错误条件,将名称与需要特定处理的条件相关联。 可以在后续的DECLARE ... HANDLER语句中引用该名称。

       条件声明必须出现在游标或处理程序声明之前。

DECLARE ... CONDITION的condition_value表示要与条件名称关联的特定条件或条件类别。 它可以采用以下形式:

  • mysql_error_code:整数文字,指示MySQL错误代码。

      注意:不要使用MySQL错误代码0,因为这表示成功而不是错误情况。 

  • SQLSTATE [VALUE] sqlstate_value:5个字符的字符串文字,指示SQLSTATE值。

       注意:不要使用以“ 00”开头的SQLSTATE值,因为这些值表示成功而不是错误情况。

       SIGNAL或使用RESIGNAL语句中引用的CONDITION名称必须与SQLSTATE值关联,而不是与MySQL错误代码关联。

       通过为条件声明名称,可以更容易地看出处理程序的目的:

DECLARE no_such_table CONDITION FOR 1051;
DECLARE CONTINUE HANDLER FOR no_such_table
  BEGIN
    -- body of handler
  END;

      这是相同条件的命名条件,但是基于相应的SQLSTATE值而不是MySQL错误代码:

DECLARE no_such_table CONDITION FOR SQLSTATE '42S02';
DECLARE CONTINUE HANDLER FOR no_such_table
  BEGIN
    -- body of handler
  END;

二、DECLARE ... HANDLER 语句

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
}

       DECLARE ... HANDLER语句指定处理一个或多个条件的处理程序。 如果出现这些情况之一,则执行指定的语句。 语句可以是简单的语句,例如SET var_name = value,也可以是使用BEGIN和END编写的复合语句。

handler_action值指示在执行处理程序语句后处理程序将执行的操作:

CONTINUE:继续执行当前程序。

EXIT:执行终止于声明处理程序的BEGIN ... END复合语句。 即使条件发生在内部块中,也是如此。

UNDO:不支持。(Mysql 5.6)

       DECLARE ... HANDLER的condition_value指示激活处理程序的特定条件或条件类别。 它可以采用以下形式:

       mysql_error_code:整数文字,指示MySQL错误代码,例如1051,用于指定“未知表”:

DECLARE CONTINUE HANDLER FOR 1051
  BEGIN
    -- body of handler
  END;

       SQLSTATE [VALUE] sqlstate_value:5个字符的字符串文字,指示SQLSTATE值,例如“ 42S01”,用于指定“未知表”:

DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'
  BEGIN
    -- body of handler
  END;

//TODO

三、GET DIAGNOSTICS 语句

       SQL语句产生的诊断信息将填充诊断区域。 GET DIAGNOSTICS语句使应用程序可以检查此信息。

       执行GET DIAGNOSTICS不需要特殊特权。

       GET DIAGNOSTICS通常在存储程序的处理程序中使用,但是它是MySQL的扩展,允许在处理程序上下文之外检查任何SQL语句的执行。

       要获取条件信息,请指定条件编号并将所需的条件项检索到目标变量中。 GET DIAGNOSTICS的此实例将SQLSTATE值和错误消息分配给用户变量@ p3和@ p4:

GET DIAGNOSTICS CONDITION 1
  @p3 = RETURNED_SQLSTATE, @p4 = MESSAGE_TEXT;

//TODO

四、RESIGNAL 语句

       RESIGNAL传递错误条件信息,该信息在存储过程或函数,触发器或事件内的复合语句内的条件处理程序执行期间可用。 RESIGNAL可能会在传递某些或所有信息之前对其进行更改。 RESIGNAL与SIGNAL有关,但是RESIGNAL可能会在修改它之后而不是像SIGNAL那样发起条件,而是中继现有条件信息。

       RESIGNAL使处理错误和返回错误信息成为可能。否则,通过在处理程序中执行SQL语句,会破坏导致处理程序激活的信息。如果给定的处理程序可以处理部分情况,则RESIGNAL还可以使某些过程更短,然后将条件“向上”传递给另一个处理程序。

      执行RESIGNAL语句不需要特权。

       所有形式的RESIGNAL都要求当前上下文是条件处理程序。否则,RESIGNAL是非法的,并且在处理程序不活动时发生RESIGNAL错误。

  • RESIGNAL Alone

       一个简单的RESIGNAL意味着“传递错误而不做任何更改”。它恢复最后一个诊断区域并使其成为当前诊断区域。也就是说,它“弹出”诊断区域堆栈。

RESIGNAL;
  • RESIGNAL使用新的信号信息

//TODO

  • RESIGNAL使用条件值和可选的新信号信息

//TODO

五、SIGNAL 语句

//TODO

六、处理程序的规则范围

//TODO

七、MySQL诊断(Diagnostics)区域

//TODO

八、CONDITION处理和OUT或INOUT参数

       如果存储过程因未处理的异常退出,则OUT和INOUT参数的修改后的值不会传播回调用方。

       如果异常由包含RESIGNAL语句的CONTINUE或EXIT处理程序处理,则RESIGNAL的执行会弹出Diagnostics Area堆栈,从而发出异常信号(即,进入处理程序之前存在的信息)。 如果异常是错误,则不会将OUT和INOUT参数的值传播回调用方。

九、CONDITION处理的限制

       禁止将SIGNAL, RESIGNAL, GET DIAGNOSTICS作为准备好的语句。 例如,此语句无效:

PREPARE stmt1 FROM 'SIGNAL SQLSTATE "02000"';

       标准SQL具有诊断区域堆栈,其中包含每个嵌套执行上下文的诊断区域。 标准SQL语法包括GET STACKED DIAGNOSTICS,用于引用堆积区域。 MySQL不支持STACKED关键字,因为只有一个诊断区域包含来自最近写入该语句的语句的信息。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为何生存

知识共享,共同进步!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值