mysql 记录执行错误_在mysql 存储过程中如何把执行的错误记录下来

你的位置:

问答吧

-> MySQL

-> 问题详情

在mysql 存储过程中如何把执行的错误记录下来

在使用mysql 的存储过程进行数据更新,删除,插入的操作,如果在更新,删除,插入的时候在存储过程中出现某种错误时,怎么能够把错误的ID号,错误信息,出现错误的SQL语句记录到自己定义的errorlog表(error_id,error_sql,error_Message,error_time)中?

-- 定义错误处理机制

declare exit Handler for SQLWARNING,SQLEXCEPTION

insert into error_log(error_message) values(........)

或者以下的存储过程的方法如何去保证update肯定成功?

1、Centos 5.2 mysql 5.1

2、customerdata 的表类型为InnoDB。存储参数都为默认值。

3、表的关键字段如下:

CREATE TABLE `customerdata`    (

`id` int(4) unsigned NOT NULL auto_increment,

`customertel` varchar(20) character set utf8 default '',

`staffno` varchar(20) character set utf8 default '',

`ifdealing` int(1) default '0',

`LastUpdateTime` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,

PRIMARY KEY  (`id`),

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC

字段说明:

customertel 电话号码,ifdealing为资料的状态,0没有人取到,1别人在处理staffno记录处理人的工号,lastUpdateTime 最后编辑资料的时间。

4、存储过程实现如下:

[Copy to clipboard] [ - ]CODE:

begin

SET   TRANSACTION   ISOLATION   LEVEL   SERIALIZABLE ;

START TRANSACTION ;

select id,customertel,staffno into Cust_id,Cust_customertel,Cust_staffno from customerdata where ifdealing=0 and staffno='' limit 1 for update;

end if;

if (Cust_id<>-1) then

update hr_customerdata set ifdealing=1,staffno=p_userid where id=Cust_id ;

end if;

commit ;

set @sql=concat("select * from customerdata where id=",Cust_id);

PREPARE stmt1 FROM @sql ;

EXECUTE stmt1 ;

DEALLOCATE PREPARE stmt1;

Set @sql=NULL;

end$$

在上面这段代码中启用了串读功能来保证同一时刻不会有两个人同时读到同一个资料,请教各位高手:

1、如果想监控到update是否成功怎么做,或者如文章开头那样,怎么把存储过程执行的所有错误都记录到表中?

2、关于并发控制,请有相关经验丰富的专家,给予指点一下,(我这里实现的还没有考虑到如果如果此时数据库异常后,对正在处理的资料的异常处理机制。)

作者: radkitty

发布时间: 2009-05-10

自己顶一下。。

作者: radkitty

发布时间: 2009-05-13

这个有办法的啊,只是mysql的异常处理机制比较弱,比较麻烦一点

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;

作者: WESTLIFE_XU

发布时间: 2009-05-13

strong,  study.

作者: liyihongcug

发布时间: 2009-05-13

这个方法只能记录在该存储过程,在执行的过程中,曾经发生过错误。哈哈

作者: radkitty

发布时间: 2009-05-14

也算是个解决方法。

作者: radkitty

发布时间: 2009-05-14

也希望在今次oracle收购了mysql后,能够把oracle的一些特性在mysql中实现,把mysql做到一个企业级别的数据库。还保持开源。哈哈

作者: radkitty

发布时间: 2009-05-14

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值