当我们处理存储过程的时候,难免会遇到如何将存储过程中的报错统一处理之后返回出来。在工作中正好需要用到这方面的知识,所以来学习并做个记录。
1 | create procedure duplicate_teams(out p int) |
这里的test表只有一个字段,我们临时测试使用,因此没有在对其创建表。
在进行调用时:
1 | call pr_test(@q); |
在默认情况下,当存储过程运行出错时,过程会立即终止,并打印系统错误消息:
1 | 1136 - Column count doesn't match value count at row 1 |
输出为空。
1. 定义异常处理
通过对异常的定义,我们可以对其作出相应的处理步骤。
DECLARE … HANDLER语句来进行定义处理:
1 |
|
2. 实践
将上述代码修改为:
1 | create procedure duplicate_teams(out p int) |
此时再去调用得到结果为 2,当为EXIT模式时,则返回10086。
3. 获取错误内容
虽然我们获取了错误,但是并没有很方便的定位到报错位置以及报错信息。mysql 5.6.4
以后的版本提供了GET DIAGNOSTICS
来获取缓冲区的报错内容。
1 |
|
代码修正如下:
1 | create procedure duplicate_teams(out result varchar(1024)) |
输出为:
1 | call pr_test(@q); |
4. 补充说明
关于错误编号
每个MySQL错误都有一个唯一的数字错误编号(mysql_error_code
),每个错误又对应一个5字符的SQLSTATE码(ANSI SQL 采用)。
SQLSTATE码对应的处理程序:
1、SQLWARNING处理程序:以‘01’开头的所有sqlstate码与之对应,对应为警告
2、NOT FOUND处理程序:以‘02’开头的所有sqlstate码与之对应为无数据
3、SQLEXCEPTION处理程序:不以‘01’或‘02’开头的所有sqlstate码,也就是所有未被SQLWARNING或NOT FOUND捕获的SQLSTATE(常遇到的MySQL错误就是非‘01’、‘02’开头的)
- 注意:‘01’、‘02’开头和‘1’、‘2’开头是有区别的,是不一样的错误sqlsate码。