error handler mysql_MySQL存储过程 ERROR Handler 异常处理

本文介绍了在MySQL中如何处理外键引用失败的错误,通过创建一个存储过程,当发生1216错误(外键约束失败)时,将错误信息记录到日志表中。此外,还展示了DECLARE HANDLER语句的使用,包括EXIT和CONTINUE两种处理器类型,以及在事务处理中如何定义和使用异常处理。同时,讲解了游标的声明、打开、读取和关闭,以及在循环中处理游标数据的方法。
摘要由CSDN通过智能技术生成

问题样例:当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)

begin

declare 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;//

/********************************************  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;//

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 中,可以使用异常处理来处理存储过程中的异常情况。MySQL 提供了两种类型的异常:条件异常和 SQLSTATE 异常。 条件异常是基于条件的自定义异常,在存储过程中使用 SIGNAL 语句来抛出异常。下面是一个示例: ```sql CREATE PROCEDURE example_procedure() BEGIN DECLARE custom_error CONDITION FOR SQLSTATE '45000'; DECLARE EXIT HANDLER FOR custom_error BEGIN -- 异常处理逻辑 -- 可以使用 GET DIAGNOSTICS 语句获取异常信息 GET DIAGNOSTICS CONDITION 1 @sql_state = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT; -- 输出异常信息 SELECT CONCAT('Error: ', @text) AS ErrorMessage; END; -- 抛出异常 SIGNAL custom_error SET MESSAGE_TEXT = 'Custom error message'; END; ``` 在上面的示例中,我们创建了一个名为 `example_procedure` 的存储过程。在存储过程中,我们定义了一个名为 `custom_error` 的条件异常。然后,我们使用 `DECLARE EXIT HANDLER FOR custom_error` 语句来指定当 `custom_error` 异常被抛出时要执行的处理程序。在处理程序中,我们使用 `GET DIAGNOSTICS` 语句获取异常信息,并输出异常信息。 另一种类型的异常是 SQLSTATE 异常,它是基于 MySQL 错误代码的系统定义异常。当出现预定义的错误代码时,MySQL 会自动抛出异常。可以使用 `DECLARE ... HANDLER FOR SQLEXCEPTION` 或 `DECLARE ... HANDLER FOR SQLWARNING` 语句来指定异常处理程序。 下面是一个使用 SQLSTATE 异常处理的示例: ```sql CREATE PROCEDURE example_procedure() BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN -- 异常处理逻辑 SELECT CONCAT('Error: ', SQLSTATE) AS ErrorMessage; END; -- 引发异常 SELECT 1 / 0; END; ``` 在这个例子中,我们创建了一个名为 `example_procedure` 的存储过程。我们使用 `DECLARE EXIT HANDLER FOR SQLEXCEPTION` 语句指定当发生任何异常时要执行的处理程序。在处理程序中,我们使用 `SQLSTATE` 函数获取异常的 SQLSTATE 值,并输出异常信息。 这些都是处理 MySQL 存储过程中异常情况的一些基本方法。你可以根据实际需求来选择适当的处理方式和异常类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值