MySQL 异常处理

来自牛奶河Wiki
阿奔讨论 | 贡献2022年12月28日 (三) 15:21的版本 (创建页面,内容为“== MySQL 异常处理 == === 一、定义异常处理: === DECLARE ... HANDLER, 必须出现在变量或条件声明的后面 当某个错误(condition_value)发生时,执行指定的语句(statement),执行完之后再决定如何操作(action) DECLARE action HANDLER FOR condition_value [, condition_value, ...]   statement ===== action: =====    CONTINUE | EXIT  # exit 只退出当前 begin end ===== condition_value: ===== * mysql…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

MySQL 异常处理

一、定义异常处理:

DECLARE ... HANDLER, 必须出现在变量或条件声明的后面

当某个错误(condition_value)发生时,执行指定的语句(statement),执行完之后再决定如何操作(action)

DECLARE action HANDLER FOR condition_value [, condition_value, ...]

  statement

action:

   CONTINUE | EXIT  # exit 只退出当前 begin end

condition_value:
  • mysql_error_code# MySQL 自定义的错误代码
  • SQLSTATE [VALUE]# ANSI SQL和 ODBC 的标准化的错误代码
  • condition_name  #
  • SQLWARNING      # 01 开头sqlstate码
  • NOT FOUND       # 02 开头sqlstate码,数据不存在的错误,如在使用游标或者SELECT无数据
  • SQLEXCEPTION    # 除‘01’或‘02’开头的所有sqlstate码

如:ERROR 1045 (28000): Access denied for user 'admin'@'m02' (using password: NO)


DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET error = '23000';

DECLARE CONTINUE HANDLER FOR SQLSTATE '21S01' SET error = '21S01';

DECLARE CONTINUE HANDLER FOR 1136 SET error = '21S01';     # 错误编号和SQLSTATE码


DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN END;             # 忽略某类错误

DECLARE EXIT HANDLER FOR SQLWARNING, NOT FOUND, SQLEXCEPTION ... # 获取所有异常


DECLARE CONTINUE HANDLER FOR NOT FOUND set error = 1;        # 忽略某类错误,置错误状态

二、错误处理器的优先级

当有多个错误处理器都满足特定错误条件的时候,MySQL将按更明确者优先的原则决定优先级。

MySQL中的每个错误都会映射到一个特定的错误码,因此错误码是最明确的。一个 SQLSTATE 可以对应到多个 MySQL 错误码,所以没那么明确。SQLEXCEPTION 和 SQLWARNING 分别指代的是 SQLSTATES 中类型相近的一组值,所以它的明确性最低。

基于错误处理器的优先级规则,MySQL 错误码处理器,SQLSTATE 错误处理器 和 SQLEXCEPTION错误处理器顺序上分别排在1、2、3位。