c mysql异常处理_mysql 存储过程异常处理

当insert失败时,我希望将其记录在日志文件中,

在这里需要创建一个主键表,以及一个外键表,我们使用的是Innodb ,因此外键关联检查是打开的,当我向外键表中插入

非主键表中的值时,动作将会失败,创建的数据表如下:

create table t2(s1 int primary key)engine=innodb;//

create table t3(s1 int,

key(s1),

foreign key (s1) references t2(s1))engine=innodb;//

create table error_log(error_message char(80));//

1. 建立一个过程,第一个语句 DECLARE EXIT HANDLER是用来处理异常的,意思是如果错误 1216发生,这个程序将会在错误记录表中插入一行,

EXIT的意思是 当动作成功提交后推出这个复合语句。

create procedure p22(parameter int)

begindeclare exit Handler for 1452     insert into error_log values(concat('Time: ',current_date,'.Foreign key reference failure for value=',parameter));

insert into t3 values(parameter);

end;//

2. 申明异常处理的语法 DECLARE HANDLER syntax:

DECLARE {EXIT|CONTINUE} HANDLER FOR {error_number|{SQLSTATE error-string}|condition} SQL Statement

上面就是错误处理的用法,也就是一段当程序出错后自动触发的代码,MYSQL允许两种处理器,一种是exit处理,另外一种是 continue处理,与exit

不同的是在于他执行后,原主程序仍然继续运行,那么该复合语句就没有出口了。

----continue处理的例子:

create table t4(s1 int primary key);//

create procedure p23()

begin

declare continue handler for SQLSTATE '23000' set @x2=1;

set @x=1;

insert into t4 values (1);

set @x=2;

insert into t4 values(1);

set @x=3;

select @x, @x2;

end;//

call p23();//

---- rollback(回滚事务),定义自己的错误处理名字 declare '错误处理名' condition for SQLSTATE'23000';

create procedure p24()

begin

declare ViolationSelf condition for SQLSTATE'23000';

DECLARE EXIT HANDLER for ViolationSelf rollback;

start transaction;

insert into t2 values(1);

insert into t2 values(1);

commit;

end;//

另一个例子

begin

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION

BEGIN

SET @x = 1;

select * from test1;

set @x=2;

END;

if (@x != 2) then

insert into error(id, message) values(4,'error4');

end if;

end

例子

declare continue handler for not found,sqlexception set v_error=1;

-- 异常处理

if v_error=1 then

insert into tmp_debug(spname,msg,vcount,vdate)

values('sp_rename_table','ERROR:not found,sqlexception',i,now());

leave error_label;

end if;

例子

delimiter //

CREATE PROCEDURE TEST()

BEGIN

DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND

begin

rollback;

insert into bb values('error');

end;

START TRANSACTION;

INSERT INTO aa VALUES (1);

INSERT INTO aa VALUES (2);

COMMIT;

END;

//

/******************************************** Cursor游标 **********************************************************/

游标实现功能的摘要: 声明游标, 打开游标,从游标里读取,关闭游标

DECLARE cursor-name CURSOR FOR SELECT ······

OPEN cursor-name;

FETCH cursor-name INTO variable;

CLOSE cursor-name;

1. create procedure p25(out return_val int)

begin

DECLARE a,b,c int;

DECLARE cur_1 CURSOR for select s1 from t;

DECLARE continue handler for not found set b=1;

open cur_1;

set c=0;

repeat

fetch cur_1 into a;

until b=1

end repeat;

close cur_1;

set return_val=a;

end;//

2.    create procedure p25_1(out return_val int)

begin

DECLARE a,b,c int;

DECLARE cur_1 CURSOR for select s1 from t;

DECLARE continue handler for not found set b=1;

open cur_1;

set c=0;

lable_1:loop

fetch cur_1 into a;

if b=1 then

leave lable_1;

end if;

set c=c+1;

end loop;

close cur_1;

set return_val=c;

end;//

create procedure p34(in va int)

begin

delete from t where s1=va;

end;//

以上均还没有测试过。

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2010-07-02 20:26

浏览 7850

分类:数据库

评论

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值