mysql存储过程异常处理


  1. DROP PROCEDURE IF EXISTS pro_test;  
  2.   
  3. create procedure pro_test(out rtn int)  
  4. begin  
  5. declare err INT default 0;  
  6. -- 如果出现异常,会自动处理并rollback  
  7. declare exit handler for  sqlexception ROLLBACK ;   
  8.   
  9.    
  10. -- 启动事务  
  11. start transaction;  
  12.   
  13. insert into test_user values(NULL,1,'啊是大三的');  
  14.   
  15. -- set err = @@IDENTITY; -- =   获取上一次插入的自增ID;  
  16. set err =last_insert_id(); -- 获取上一次插入的自增ID  
  17. insert into test_user VALUES(NULL,23,err);  
  18.    
  19. -- 运行没有异常,提交事务  
  20. commit;  
  21. -- 设置返回值为1  
  22. set rtn=1;  
  23. end;  
  24. DROP PROCEDURE IF EXISTS pro_test;
    
    create procedure pro_test(out rtn int)
    begin
    declare err INT default 0;
    -- 如果出现异常,会自动处理并rollback
    declare exit handler for  sqlexception ROLLBACK ; 
    
     
    -- 启动事务
    start transaction;
    
    insert into test_user values(NULL,1,'啊是大三的');
    
    -- set err = @@IDENTITY; -- =	获取上一次插入的自增ID;
    set err =last_insert_id(); -- 获取上一次插入的自增ID
    insert into test_user VALUES(NULL,23,err);
     
    -- 运行没有异常,提交事务
    commit;
    -- 设置返回值为1
    set rtn=1;
    end;


mysql 异常处理

--该文章内容通过网络搜索组合,

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 THEN
ROLLBACK;
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

 --在异常处,先回滚之前开启的事物,再重新开启事物,提交日志信息。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值