admin管理员组文章数量:1599530
在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关键字,因为只有一个诊断区域包含来自最近写入该语句的语句的信息。
版权声明:本文标题:Mysql Condition(情况)处理 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728322341a1153989.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论