深圳全飞鸿
标题:
mysql的SQLERRM (异常处理, continue, gotoendproc)
[打印本页]
作者:
zhgc
时间:
2021-9-11 19:15
标题:
mysql的SQLERRM (异常处理, continue, gotoendproc)
mysql的SQLERRM (异常处理, continue, gotoendproc)
来至oracle的应用SQLERRM
DECLARE exit handler for SQLEXCEPTION
begin
<span style="color: #008000; "> set RES=@h;</span>
end ;
复制代码
由于历史原因,所有记录异常的内部变量都定义为@h
作者:
zhgc
时间:
2021-9-11 19:17
来至oracle的应用SQLERRM
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 InvalidJSON CONDITION FOR 3141 ;
DECLARE EXIT HANDLER FOR InvalidJSON BEGIN END;
declare..condition 为一个error声明一个别名,将这个别名与错误连接起来,相当于给错误代码起一个友好的别名供异常处理使用 随后的declare..handler 可以使用这个别名
使用别名可以让代码更加便于理解。举个例子,这个处理程序适用于尝试删除一个不存在的表,但这是因为你知道1051错误代码的定义才会这样声明handler
DECLARE CONTINUE HANDLER FOR 1051
BEGIN
-- body of handler
END;
复制代码
通过为1051声明一个别名,这段处理程序的目的将更容易被读者了解
DECLARE no_such_table CONDITION FOR 1051;
DECLARE CONTINUE HANDLER FOR no_such_table
BEGIN
-- body of handler
END;
复制代码
下面是一个错误相同,但是基于相应的SQLSTATE值而不是MySQL error code的例子:
DECLARE no_such_table CONDITION FOR SQLSTATE '42S02';
DECLARE CONTINUE HANDLER FOR no_such_table
BEGIN
-- body of handler
END;
复制代码
SQLSTATE 42S02 为所有没有该表错误的总称:
mysql> SELECT * FROM FAN;
ERROR 1146 (42S02): Table 'fandb.FAN' doesn't exist
mysql> DROP TABLE FAN;
ERROR 1051 (42S02): Unknown table 'fandb.FAN'
Error: 1051 SQLSTATE: 42S02 (ER_BAD_TABLE_ERROR)
Message: Unknown table '%s'
Error: 1109 SQLSTATE: 42S02 (ER_UNKNOWN_TABLE) -multi delete时没有该表
Message: Unknown table '%s' in %s
Error: 1146 SQLSTATE: 42S02 (ER_NO_SUCH_TABLE)
复制代码
Message: Table '%s.%s' doesn't exist
需要注意的是使用signal和resignal是只能使用SQLSTATE不能使用mysql error code
欢迎光临 深圳全飞鸿 (http://www.nagomes.com/disc/)
Powered by Discuz! X3.2