MySQL 异常处理:修订间差异

来自牛奶河Wiki
跳到导航 跳到搜索
无编辑摘要
无编辑摘要
 
(未显示同一用户的1个中间版本)
第1行: 第1行:
== MySQL 异常处理 ==
MySQL 异常处理


=== 定义异常处理: ===
=== 定义异常处理 ===
DECLARE ... HANDLER, 必须出现在变量或条件声明的后面
DECLARE ... HANDLER, 必须出现在变量或条件声明的后面


第10行: 第10行:
  statement
  statement


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


===== condition_value: =====
===== condition_value =====


* mysql_error_code# MySQL 自定义的错误代码
* mysql_error_code# MySQL 自定义的错误代码

2022年12月30日 (五) 15:55的最新版本

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位。