SQL中的异常处理

1.自己定义一个新的错误类型与系统中的某个错误类型相对应.

复制代码
1 #格式:DECLARE 错误名称 CONDITION FOR 错误码(或错误条件)
2 
3 #举例1:定义“Field_Not_Be_NULL”错误名与MySQL中违反非空约束的错误类型
4 #是“ERROR 1048 (23000)”对应。
5 #方式1:使用MySQL_error_code
6 DECLARE Field_Not_Be_NULL CONDITION FOR 1048;
7 
8 #方式2:使用sqlstate_value
9 DECLARE Field_Not_Be_NULL CONDITION FOR SQLSTATE '23000';
复制代码
1 #举例2:定义"ERROR 1148(42000)"错误,名称为command_not_allowed。
2 #方式1:使用MySQL_error_code
3 DECLARE command_not_allowed CONDITION FOR 1148;
4 
5 #方式2:使用sqlstate_value
6 DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000';

这些错误类型的编码需要去查看编译信息才能得到

格式:DECLARE 自定义错误名称 CONDITION FOR 错误码(根据系统报错信息得到)

 

共有两种方式:1.直接写错误类型   2.SQLDATE '错误编码'

 

2.定义处理程序

即在遇到对应的程序异常时,为其定义一个处理方式

常见的几种错误类型:

1.SQLSTATE '字符串错误码':表示长度为5的sqlstate_value类型的错误代码

2.MySQL_error_code:匹配数值类型错误代码 

3.错误名称:表示DECLARE...CONDITION定义的错误条件名称 

4.SQLWARNING:匹配所有以01开头的SQLSTATE错误代码

5.NOT FOUND:匹配所有以02开通的SQLSTATE错误代码

6.SQLEXCEPTION:匹配所有没被4或5捕获的SQLSTATE错误代码

常见的三种处理方式:

1.CONTINUE:直接无视所对应的错误,继续向下执行

2.EXIT:遇见对应的错误则直接退出终止程序

3.UNDO:遇见对应的错误则将程序返回到错误发生前来进行执行(MySQL暂不支持该操作)

复制代码
 1 #举例:
 2 #方法1:捕获sqlstate_value
 3 DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info = 'NO_SUCH_TABLE';
 4 
 5 #方法2:捕获mysql_error_value
 6 DECLARE CONTINUE HANDLER FOR 1146 SET @info = 'NO_SUCH_TABLE';
 7 
 8 #方法3:先定义条件,再调用
 9 DECLARE no_such_table CONDITION FOR 1146;
10 DECLARE CONTINUE HANDLER FOR no_such_table SET @info = 'NO_SUCH_TABLE';
11 
12 #方法4:使用SQLWARNING
13 DECLARE EXIT HANDLER FOR SQLWARNING SET @info = 'ERROR';
14 
15 #方法5:使用NOT FOUND
16 DECLARE EXIT HANDLER FOR NOT FOUND SET @info = 'NO_SUCH_TABLE';
17 
18 #方法6:使用SQLEXCEPTION
19 DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info = 'ERROR';
复制代码

语句格式:

DECLARE 处理类型(CONTINUE/EXIT) HANDLER  FOR 某种错误类型 SET @info = 'ERROR'(值可以任意,但应该取得有意义)

 

3.错误处理在程序中的使用

复制代码
 1 #重新定义存储过程,体现错误的处理程序
 2 DELIMITER //
 3 
 4 CREATE PROCEDURE UpdateDataNoCondition()
 5     BEGIN
 6         #声明处理程序
 7         #处理方式1:
 8         DECLARE CONTINUE HANDLER FOR 1048 SET @prc_value = -1;
 9         #处理方式2:
10         #DECLARE CONTINUE HANDLER FOR sqlstate '23000' SET @prc_value = -1;
11         
12         SET @x = 1;
13         UPDATE employees SET email = NULL WHERE last_name = 'Abel';
14         SET @x = 2;
15         UPDATE employees SET email = 'aabbel' WHERE last_name = 'Abel';
16         SET @x = 3;
17     END //
18 
19 DELIMITER ;
复制代码
复制代码
 1 DELIMITER //
 2 
 3 CREATE PROCEDURE InsertDataWithCondition()
 4     BEGIN        
 5         
 6         #处理程序
 7         #方式1:
 8         #declare exit handler for 1062 set @pro_value = -1;
 9         #方式2:
10         #declare exit handler for sqlstate '23000' set @pro_value = -1;
11         #方式3:
12         #定义条件
13         DECLARE duplicate_entry CONDITION FOR 1062;
14         DECLARE EXIT HANDLER FOR duplicate_entry SET @pro_value = -1;
15         
16         SET @x = 1;
17         INSERT INTO departments(department_name) VALUES('测试');
18         SET @x = 2;
19         INSERT INTO departments(department_name) VALUES('测试');
20         SET @x = 3;
21     END //
22 
23 DELIMITER ;
复制代码

 

posted @   jue1e0  阅读(1016)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
点击右上角即可分享
微信分享提示