深圳全飞鸿

标题: mysql的SQLERRM (异常处理, continue, gotoendproc) [打印本页]

作者: zhgc    时间: 2021-9-11 19:15
标题: mysql的SQLERRM (异常处理, continue, gotoendproc)
mysql的SQLERRM (异常处理, continue, gotoendproc)

来至oracle的应用SQLERRM   
  1.   DECLARE exit handler for SQLEXCEPTION

  2.   begin

  3. <span style="color: #008000; ">         set  RES=@h;</span>

  4.   end ;
复制代码

由于历史原因,所有记录异常的内部变量都定义为@h



作者: zhgc    时间: 2021-9-11 19:17
来至oracle的应用SQLERRM
  1.     DECLARE handler_action HANDLER  
  2.         FOR condition_value [, condition_value] ...  
  3.         statement  
  4.       
  5.     handler_action:  
  6.         CONTINUE  
  7.       | EXIT  
  8.       | UNDO  
  9.       
  10.     condition_value:  
  11.         mysql_error_code  
  12.       | SQLSTATE [VALUE] sqlstate_value  
  13.       | condition_name  
  14.       | SQLWARNING  
  15.       | NOT FOUND  
  16.       | SQLEXCEPTION  
复制代码


DECLARE InvalidJSON CONDITION FOR 3141 ;
DECLARE EXIT HANDLER FOR InvalidJSON BEGIN END;

declare..condition 为一个error声明一个别名,将这个别名与错误连接起来,相当于给错误代码起一个友好的别名供异常处理使用 随后的declare..handler 可以使用这个别名
使用别名可以让代码更加便于理解。举个例子,这个处理程序适用于尝试删除一个不存在的表,但这是因为你知道1051错误代码的定义才会这样声明handler
  1. DECLARE CONTINUE HANDLER FOR 1051
  2.   BEGIN
  3.     -- body of handler
  4.   END;
复制代码

通过为1051声明一个别名,这段处理程序的目的将更容易被读者了解
  1. DECLARE no_such_table CONDITION FOR 1051;
  2. DECLARE CONTINUE HANDLER FOR no_such_table
  3.   BEGIN
  4.     -- body of handler
  5.   END;
复制代码

下面是一个错误相同,但是基于相应的SQLSTATE值而不是MySQL error code的例子:
  1. DECLARE no_such_table CONDITION FOR SQLSTATE '42S02';
  2. DECLARE CONTINUE HANDLER FOR no_such_table
  3.   BEGIN
  4.     -- body of handler
  5.   END;
复制代码

SQLSTATE 42S02 为所有没有该表错误的总称:
  1. mysql> SELECT * FROM FAN;
  2. ERROR 1146 (42S02): Table 'fandb.FAN' doesn't exist
  3. mysql> DROP TABLE FAN;
  4. ERROR 1051 (42S02): Unknown table 'fandb.FAN'

  5. Error: 1051 SQLSTATE: 42S02 (ER_BAD_TABLE_ERROR)

  6. Message: Unknown table '%s'

  7. Error: 1109 SQLSTATE: 42S02 (ER_UNKNOWN_TABLE)  -multi delete时没有该表

  8. Message: Unknown table '%s' in %s

  9. 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