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 ;
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)