深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 601|回复: 1
打印 上一主题 下一主题

mysql的SQLERRM (异常处理, continue, gotoendproc)

[复制链接]

800

主题

1379

帖子

7725

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7725
跳转到指定楼层
楼主
发表于 2021-9-11 19:15:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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


回复

使用道具 举报

800

主题

1379

帖子

7725

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7725
沙发
 楼主| 发表于 2021-9-11 19:17:09 | 只看该作者
来至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
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-6-28 22:13 , Processed in 0.062866 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表