作者:华东师大中北文艺部 | 来源:互联网 | 2023-06-05 11:06
MySQL存储过程中的错误处理作者:UncleToo来源:翻译日期:2014-05-207:53:13收藏评论:( 2 )阅读:1985当MySQL执行存储过程遇到
MySQL存储过程中的错误处理
作者:UncleToo 来源:翻译 日期:2014-05-20 7:53:13
收藏 评论:( 2 ) 阅读:1985
当MySQL执行存储过程遇到错误时,适当处理它,如继续执行或退出当前代码段,并返回有意义的错误提示是很重要的。一方面提高程序的容错能力,另一方便当程序出错时,开发人员也能准确定位错误的地方。
声明处理程序
MySQL为我们提供了一种简单的方法定义处理程序,我们可以使用DECLARE HANDLER语句,如下所示:
1
DECLARE action HANDLERFOR condition_value statement;
如果其值与condition_value匹配,MySQL将执行statement,并且根据action值选择继续或退出当前代码块。
action 可以是以下两种:
CONTINUE:继续执行当前代码块
EXIT:退出当前代码块
condition_value 是一类特定的条件,可以使一下几种:
一个MYSQL错误代码
一个标准的SQLSTATE值,如SQLWARNING,NOTFOUND ,SQLEXCEPTION等
statement 是一个语句块,从BEGIN开始,到END结束。它可以是一个简单的sql语句,也可以是很复杂的逻辑语句。
MySQL错误处理的例子
例1:当程序发生错误,将has_error值置为1。如:
1
DECLARE CONTINUE HANDLERFOR SQLEXCEPTIONSET has_error = 1;
例2:当遇到错误时,程序将回滚之前的操作,同时给出错误提示,然后退出当前程序块。如:
1
2
3
4
5
DECLARE EXIT HANDLERFOR SQLEXCEPTION
BEGIN
ROLLBACK;
Select ‘发生错误,执行将被回滚,程序将终止执行’;
END;
例3:对于游标或select into操作,如果出现找不到记录的情况,将no_row_found赋值为1。如:
1
DECLARE CONTINUE HANDLERFOR NOT FOUNDSET no_row_found = 1;
例4:如果出现重复键值,MySQL会给出1062的错误,将给出错误提示,程序继续运行。如:
1
2
DECLARE CONTINUE HANDLERFOR 1062
Select ‘错误:重复键值’;
在存储过程中MySQL的处理程序的例子
首先我们创建一张数据表,为测试所用。
1
2
3
4
5
Create TABLE article_tags(
article_idINT,
tag_idINT,
PRIMARY KEY(article_id,tag_id)
);
article_tags表用来存储文章及标签之间的关系(多对多)。article_id存储文章ID,tag_id存储标签ID
其次,我们创建一个存储过程,实现插入文章ID和标签ID。
1
2
3
4
5
6
7
8
9
10
11
DELIMITER $$
Create PROCEDURE insert_article_tags(IN article_idINT,IN tag_idINT)
BEGIN
DECLARE CONTINUE HANDLERFOR 1062
Select CONCAT(‘错误:重复键值 (‘,article_id,’,’,tag_id,’)’)AS msg;
— 插入新的记录
Insert INTO article_tags(article_id,tag_id)
VALUES(article_id,tag_id);
— 返回标签数量
Select COUNT(*)FROM article_tags;
END