| --该文章内容通过网络搜索组合, mysql 异常,可以自定义异常,再应用。也可使用系统默认的异常,捕获应用。 一、异常定义: DECLARE condition_name CONDITION FOR [condition_type]; condition_name参数表示异常的名称; condition_type参数异常类型 condition_type由SQLSTATE [VALUE] sqlstate_value|mysql_error_code组成: sqlstate_value和mysql_error_code都可以表示MySQL的错误; sqlstate_value为长度为5的字符串类型的错误代码;mysql_error_code为数值类型错误代码; 举例: 定义“ERROR 1148(42000)”错误,名称为command_not_allowed。可以有以下两种方法: //方法一:使用sqlstate_value DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000'; //方法二:使用mysql_error_code DECLARE command_not_allowed CONDITION FOR 1148; 二、异常处理 DECLARE handler_type HANDLER FOR condition_value [,...] sp_statement handler_type: CONTINUE|EXIT|UNDO handler_type为错误处理方式,参数为3个值之一; CONTINUE表示遇到错误不处理,继续执行; EXIT表示遇到错误时马上退出; UNDO表示遇到错误后撤回之前的操作,MySQL暂不支持回滚操作;   condition_value: SQLSTATE [VALUE] sqlstate_value| condition_name|SQLWARNING|NOT FOUND|SQLEXCEPTION|mysql_error_code condition_value表示错误类型;SQLSTATE [VALUE] sqlstate_value为包含5个字符的字符串错误值;condition_name表示DECLARE CONDITION定义的错误条件名称;
 SQLWARNING匹配所有以01开头的SQLSTATE错误代码; NOT FOUND匹配所有以02开头的SQLSTATE错误代码; SQLEXCEPTION匹配所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE错误代码; mysql_error_code匹配数值类型错误代码;   举例: //方法一:捕获sqlstate_value异常 //这种方法是捕获sqlstate_value值。如果遇到sqlstate_value值为"42S02",执行CONTINUE操作,并输出"NO_SUCH_TABLE"信息 DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='NO_SUCH_TABLE'; //方法二:捕获mysql_error_code异常 //这种方法是捕获mysql_error_code值。如果遇到mysql_error_code值为1146,执行CONTINUE操作,并输出"NO_SUCH_TABLE"信息; DECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE'; //方法三:先定义条件,然后捕获异常 DECLARE no_such_table CONDITION FOR 1146; DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info='NO_SUCH_TABLE'; //方法四:使用SQLWARNING捕获异常 DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR'; //方法五:使用NOT FOUND捕获异常 DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE'; //方法六:使用SQLEXCEPTION捕获异常 DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';   3.实例   1. CREATE  PROCEDURE P_TEST_EXCEP() BEGIN DECLARE EXIT HANDLER for SQLEXCEPTION INSERT into TEST_LOG(id) VALUES(1); START TRANSACTION; INSERT into TEST(id) VALUES(11);--主键不冲突INSERT into TEST(id) VALUES(1);--主键冲突
 INSERT into TEST(id) VALUES(111);--主键不冲突 commit; END  --实际发现,此时日志表也被回滚了。 2、 CREATE  PROCEDURE P_TEST_EXCEP() BEGIN declare t_error int default 0; DECLARE CONTINUE HANDLER for SQLEXCEPTION SET t_error=1;
 START TRANSACTION;
 INSERT into TEST(id) VALUES(11);--主键不冲突INSERT into TEST(id) VALUES(1);--主键冲突
 INSERT into TEST(id) VALUES(111);--主键不冲突 if t_error=1 THENROLLBACK;
 ELSE
 commit;
 end if;
 END  3. CREATE  PROCEDURE P_TEST_EXCEP() BEGIN DECLARE EXIT HANDLER for SQLEXCEPTION  begin  ROLLBACK ; START TRANSACTION;INSERT into TEST_LOG(id) VALUES(1); commit; end; START TRANSACTION; INSERT into TEST(id) VALUES(11);--主键不冲突INSERT into TEST(id) VALUES(1);--主键冲突
 INSERT into TEST(id) VALUES(111);--主键不冲突 commit; END  --在异常处,先回滚之前开启的事物,再重新开启事物,提交日志信息。   |