MySQL Error Handling in Stored Procedures---转载
This tutorial shows you how to use MySQL handler to handle exceptions or errors encountered in stored procedures.
When an error occurs inside a stored procedure, it is important to handle it appropriately, such as continuing or exiting the current code block’s execution, and issuing a meaningful error message.
MySQL provides an easy way to define handlers that handle from general conditions such as warnings or exceptions to specific conditions e.g., specific error codes.
Declaring a handler
To declare a handler, you use the DECLARE HANDLER
statement as follows:
1
|
DECLARE action HANDLER FOR condition_value statement;
|
If a condition whose value matches the condition_value
, MySQL will execute the statement
and continue or exit the current code block based on the action
.
The action
accepts one of the following values:
CONTINUE
: the execution of the enclosing code block (BEGIN
…END
) continues.EXIT
: the execution of the enclosing code block, where the handler is declared, terminates.
The condition_value
specifies a particular condition or a class of conditions that activates the handler. The condition_value
accepts one of the following values:
- A MySQL error code.
- A standard
SQLSTATE
value. Or it can be anSQLWARNING
,NOTFOUND
orSQLEXCEPTION
condition, which is shorthand for the class ofSQLSTATE
values. TheNOTFOUND
condition is used for a cursororSELECT INTO variable_list
statement. - A named condition associated with either a MySQL error code or
SQLSTATE
value.
The statement
could be a simple statement or a compound statement enclosing by the BEGIN
andEND
keywords.
MySQL error handling examples
Let’s look into several examples of declaring handlers.
The following handler means if an error occurs, set the value of the has_error
variable to 1 and continue the execution.
1
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET has_error = 1;
|
The following is another handler; it means that in case any error occurs, rollback the previous operation, issue an error message and exit the current code block. If you declare it inside the BEGIN END
block of a stored procedure, it will terminate stored procedure immediately.
1
2
3
4
5
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated';
END;
|
If there are no more rows to fetch, in case of a cursoror SELECT INTOstatement, set the value of the no_row_found
variable to 1 and continue execution.
1
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_row_found = 1;
|
If a duplicate key error occurs, MySQL error 1062 is issued. The following handler issues an error message and continues execution.
1
2
|
DECLARE CONTINUE HANDLER FOR 1062
SELECT 'Error, duplicate key occurred';
|
MySQL handler example in stored procedures
First, we create a new table named article_tags
for the demonstration:
1
2
3
4
5
|
CREATE TABLE article_tags(
article_id INT,
tag_id INT,
PRIMARY KEY(article_id,tag_id)
);
|
The article_tags
table stores the relationships between articles and tags. Each article may have many tags and vice versa. For the sake of simplicity, we don’t create articles
and tags
tables, as well as the foreign keys in the article_tags
table.
Second, we create a stored procedure that inserts a pair of ids of article and tag into the article_tags
table:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
DELIMITER $$
CREATE PROCEDURE insert_article_tags(IN article_id INT, IN tag_id INT)
BEGIN
DECLARE CONTINUE HANDLER FOR 1062
SELECT CONCAT('duplicate keys (',article_id,',',tag_id,') found') AS msg;
-- insert a new record into article_tags
INSERT INTO article_tags(article_id,tag_id)
VALUES(article_id,tag_id);
-- return tag count for the article
SELECT COUNT(*) FROM article_tags;
END
|
Third, we add tag id 1, 2 and 3 for the article 1 by calling the insert_article_tags
stored procedure as follows:
1
2
3
|
CALL insert_article_tags(1,1);
CALL insert_article_tags(1,2);
CALL insert_article_tags(1,3);
|
Fourth, let’s try to insert a duplicate key to see if the handler is really invoked.
1
|
CALL insert_article_tags(1,3);
|
We got an error message. However, because we declared the handler as a CONTINUE
handler, the stored procedure continued execution. As the result, we got the tag count for the article as well.
If we change the CONTINUE
in the handler declaration to EXIT
, we will get only the error message.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
DELIMITER $$
CREATE PROCEDURE insert_article_tags_2(IN article_id INT, IN tag_id INT)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
SELECT 'SQLException invoked';
DECLARE EXIT HANDLER FOR 1062
SELECT 'MySQL error code 1062 invoked';
DECLARE EXIT HANDLER FOR SQLSTATE '23000'
SELECT 'SQLSTATE 23000 invoked';
-- insert a new record into article_tags
INSERT INTO article_tags(article_id,tag_id)
VALUES(article_id,tag_id);
-- return tag count for the article
SELECT COUNT(*) FROM article_tags;
END
|
Now, we can try to add a duplicate key to see the effect.
1
|
CALL insert_article_tags_2(1,3);
|
MySQL handler precedence
In case there are multiple handlers that are eligible for handling an error, MySQL will call the most specific handler to handle the error.
An error always maps to one MySQL error code so a MySQL it is the most specific. An SQLSTATE
may map to many MySQL error codes therefore it is less specific. An SQLEXCPETION
or an SQLWARNING
is the shorthand for a class of SQLSTATES
values so it is the most generic.
Based on the handler precedence’s rules, MySQL error code handler, SQLSTATE
handler andSQLEXCEPTION
takes the first, second and third precedence.
Suppose we declare three handlers in the insert_article_tags_3
stored procedure as follows:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
DELIMITER $$
CREATE PROCEDURE insert_article_tags_3(IN article_id INT, IN tag_id INT)
BEGIN
DECLARE EXIT HANDLER FOR 1062 SELECT 'Duplicate keys error encountered';
DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT 'SQLException encountered';
DECLARE EXIT HANDLER FOR SQLSTATE '23000' SELECT 'SQLSTATE 23000';
-- insert a new record into article_tags
INSERT INTO article_tags(article_id,tag_id)
VALUES(article_id,tag_id);
-- return tag count for the article
SELECT COUNT(*) FROM article_tags;
END
|
We now try to insert a duplicate key into the article_tags
table by calling the stored procedure:
1
|
CALL insert_article_tags_3(1,3);
|
As you see the MySQL error code handler is called.
Using named error condition
Let’s start with an error handler declaration.
1
2
|
DECLARE EXIT HANDLER FOR 1051 SELECT 'Please create table abc first';
SELECT * FROM abc;
|
What does the number 1051 really mean? Imagine you have a big stored procedure polluted with those numbers all over places; it will become a nightmare for the maintenance developers.
Fortunately, MySQL provides us with the DECLARE CONDITION
statement that declares a named error condition, which associates with a condition. The syntax of the DECLARE CONDITION
statement is as follows:
1
|
DECLARE condition_name CONDITION FOR condition_value;
|
The condition_value
can be a MySQL error code such as 1015 or a SQLSTATE
value. The condition_value
is represented by the condition_name
.
After declaration, you can refer to the condition_name
instead of the condition_value
.
So we can rewrite the code above as follows:
1
2
3
|
DECLARE table_not_found CONDITION for 1051;
DECLARE EXIT HANDLER FOR table_not_found SELECT 'Please create table abc first';
SELECT * FROM abc;
|
This code is obviously more readable than the previous one.
Notice that the condition declaration must appear before handler or cursor declarations.
原文:http://www.mysqltutorial.org/mysql-error-handling-in-stored-procedures/
MySQL Error Handling in Stored Procedures---转载的更多相关文章
- MySQL Error Handling in Stored Procedures 2
Summary: this tutorial shows you how to use MySQL handler to handle exceptions or errors encountered ...
- MySQL Error Handling in Stored Procedures
http://www.mysqltutorial.org/mysql-error-handling-in-stored-procedures/ mysql存储过程中的异常处理 定义异常捕获类型及处 ...
- mysql Error Handling and Raising in Stored Procedures
MySQL的存储过程错误捕获方式和Oracle的有很大的不同. MySQL中可以使用DECLARE关键字来定义处理程序.其基本语法如下: DECLARE handler_type HANDLER FO ...
- Spring MVC-表单(Form)标签-错误处理(Error Handling)示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_errors.htm 说明:示例基于Spring MVC 4.1.6. 以下示例显 ...
- An Introduction to Stored Procedures in MySQL 5
https://code.tutsplus.com/articles/an-introduction-to-stored-procedures-in-mysql-5--net-17843 MySQL ...
- [MySQL] Stored Procedures 【转载】
Stored routines (procedures and functions) can be particularly useful in certain situations: When mu ...
- Home / Python MySQL Tutorial / Calling MySQL Stored Procedures in Python Calling MySQL Stored Procedures in Python
f you are not familiar with MySQL stored procedures or want to review it as a refresher, you can fol ...
- Cursors in MySQL Stored Procedures
https://www.sitepoint.com/cursors-mysql-stored-procedures/ After my previous article on Stored Proce ...
- MySql Error: Can't update table in stored function/trigger
MySql Error: Can't update table in stored function/trigger because it is already used by statement w ...
随机推荐
- 2016多校联合训练contest4 1012Bubble Sort
Bubble Sort Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...
- 使用URLClassLoader类载入类实例
Tomcat当中在接受到要调用的Servlet请求后,需要载入相应的Servlet类,然后创建Servlet类实例,从而调用Servlet类实例的service()方法 下面实例的场景,request ...
- Mozilla正在SpiderMonkey中测试JavaScript并行计算
Mozilla正致力于实现JavaScript“并行(parallelism)计算”,以便充分利用硬件性能.Dave Herman是Mozilla Research的首席研究员和策略总监.近日,他在一 ...
- MySQL FEDERATED引擎使用示例, 类似Oracle DBLINK
原文地址:http://it.dataguru.cn/article-3352-1.html 摘要: 本地MySQL数据库要访问远程MySQL数据库的表中的数据, 必须通过FEDERATED存储引擎来 ...
- 在Eclipse中安装spket插件
spket是一个开发JavaScript和Ext等的开发工具,它可以 是独立的IDE,也可以作为 Eclipse的插件使用,下面介绍如何在Eclipse中安装spket插件, 1.首先上 官网 htt ...
- QT事件过滤器(QT事件处理的5个层次:自己覆盖或过滤,父窗口过滤,Application过滤与通知)
Qt事件模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的事件. 让我们试着设想已经有了一个CustomerInfoDialog的小部件.CustomerInfoD ...
- 一些记录查询的SQL语句
-- ======================== 第三天 =========================== CREATE DATABASE php0408 CHARSET utf8 ;CR ...
- Storm on Yarn 安装配置
1.背景知识 在不修改Storm任何源代码的情况下,让Storm运行在YARN上,最简单的实现方法是将Storm的各个服务组件(包括Nimbus和Supervisor),作为单独的任务运行在YARN上 ...
- asp.net中水印的实现代码
水印是为了防止别盗用我们的图片. 两种方式实现水印效果 1)可以在用户上传时添加水印. a) 好处:与2种方法相比,用户每次读取此图片时,服务器直接发送给客户就行了. b) 缺点:破坏了原始图 ...
- [LeetCode#159] Missing Ranges Strobogrammatic Number
Problem: Given a string, find the length of the longest substring T that contains at most 2 distinct ...