MySQL定义异常和异常处理方法
在MySQL中。特定异常须要特定处理。这些异常可以联系到错误,以及子程序中的一般流程控制。定义异常是事先定义程序运行过程中遇到的问题,异常处理定义了在遇到问题时相应当採取的处理方式。而且保证存储过程或者函数在遇到错误时或者警告时可以继续运行。
1 异常定义
1.1 语法
DECLARE condition_name CONDITION FOR [condition_type];
1.2 说明
condition_name參数表示异常的名称;
condition_type參数表示条件的类型,condition_type由SQLSTATE [VALUE] sqlstate_value|mysql_error_code组成:
- sqlstate_value和mysql_error_code都能够表示MySQL的错误。
- sqlstate_value为长度为5的字符串类型的错误代码;
- mysql_error_code为数值类型错误代码。
1.3 演示样例
定义“ERROR 1148(42000)”错误,名称为command_not_allowed。
能够有下面两种方法:
//方法一:使用sqlstate_value
DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000';
//方法二:使用mysql_error_code
DECLARE command_not_allowed CONDITION FOR 1148;
2 自己定义异常处理
2.1 异常处理语法
DECLARE handler_type HANDLER FOR condition_value [,...] sp_statement
2.2 參数说明
handler_type: CONTINUE|EXIT|UNDO
- handler_type为错误处理方式。參数为3个值之中的一个;
- CONTINUE表示遇到错误不处理,继续运行;
- EXIT表示遇到错误时立即退出。
- UNDO表示遇到错误后撤回之前的操作,MySQL暂不支持回滚操作;
condition_value: SQLSTATE [VALUE] sqlstate_value| condition_name|SQLWARNING|NOT FOUND|SQLEXCEPTION|mysql_error_code
- condition_value表示错误类型;
- SQLSTATE [VALUE] sqlstate_value为包括5个字符的字符串错误值;
- condition_name表示DECLARE CONDITION定义的错误条件名称;
- SQLWARNING匹配全部以01开头的SQLSTATE错误代码。
- NOT FOUND匹配全部以02开头的SQLSTATE错误代码。
- SQLEXCEPTION匹配全部没有被SQLWARNING或NOT FOUND捕获的SQLSTATE错误代码;
- mysql_error_code匹配数值类型错误代码;
2.3 异常捕获方法
//方法一:捕获sqlstate_value异常
//这样的方法是捕获sqlstate_value值。
假设遇到sqlstate_value值为"42S02",运行CONTINUE操作,并输出"NO_SUCH_TABLE"信息
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='NO_SUCH_TABLE';
//方法二:捕获mysql_error_code异常
//这样的方法是捕获mysql_error_code值。假设遇到mysql_error_code值为1146,运行CONTINUE操作,并输出"NO_SUCH_TABLE"信息;
DECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE';
//方法三:先定义条件,然后捕获异常
DECLARE no_such_table CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info='NO_SUCH_TABLE';
//方法四:使用SQLWARNING捕获异常
DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';
//方法五:使用NOT FOUND捕获异常
DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE';
//方法六:使用SQLEXCEPTION捕获异常
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';
3 综合演示样例
创建一个表,设置该表的主键,在不定义异常处理和定义异常处理情况下看运行到哪一步。
show databases;
use wms;
create table location
(
location_id int primary key,
location_name varchar(50)
);
演示样例1:不定义异常情况下
DELIMITER //
CREATE PROCEDURE handlerInsertNoException()
BEGIN
/*DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;*/
SET @x=1;
INSERT INTO location VALUES (1,'Beijing');
SET @x=2;
INSERT INTO location VALUES (1,'Wuxi');
SET @x=3;
END;
//
DELIMITER ;
调用存储过程与结果:
mysql> call handlerInsertNoException();
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> select @x;
+------+
| @x |
+------+
| 2 |
+------+
1 row in set (0.00 sec) mysql> select * from location;
+-------------+---------------+
| location_id | location_name |
+-------------+---------------+
| 1 | Beijing |
+-------------+---------------+
1 row in set (0.00 sec)
注意:操作演示样例2前要清空表中数据。并退出又一次登录,以免client变量@x影响,具体说明參见结论中的第一点。
mysql> truncate table location;
Query OK, 0 rows affected (0.04 sec)
mysql> select * from location;
Empty set (0.00 sec)
mysql> exit;
Bye david@Louis:~$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 53
Server version: 5.5.38-0ubuntu0.14.04.1 (Ubuntu) mysql> use wms;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> select * from location;
Empty set (0.00 sec) mysql> select @x;
+------+
| @x |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
演示样例2:定义异常处理情况下:
DELIMITER //
CREATE PROCEDURE handlerInsertWithException()
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;
SET @x=1;
INSERT INTO location VALUES (1,'Beijing');
SET @x=2;
INSERT INTO location VALUES (1,'Wuxi');
SET @x=3;
END;
//
DELIMITER ;
调用存储过程与结果:
mysql> CALL handlerInsertWithException();
Query OK, 0 rows affected (0.09 sec) mysql> select @x;
+------+
| @x |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
说明与结论:
一、MySQL中。@var_name表示用户变量,使用SET语句为其赋值,用户变量与连接有关,一个client定义的变量不能被其它client看到或者使用。当client退出时。该client连接的全部变量将自己主动释放。
二、在演示样例1中,因为凝视了异常的声明"",此时向表中插入同样主键。就会触发异常。而且採取默认(EXIT)路径。且查看此时的@x返回2,表示以下的INSERT语句并没有运行就退出了.
三、定义了异常处理,此时遇到错误也会依照异常定义那样继续运行;但仅仅有第一条数据被插入到表中,此时用户变量@x=3说明已经运行到了结尾;
-----------------------------------------------------------------------------------------------------------------------------
假设您们在尝试的过程中遇到什么问题或者我的代码有错误的地方。请给予指正,很感谢!
联系方式:david.louis.tian@outlook.com
版权@:转载请标明出处!
MySQL定义异常和异常处理方法的更多相关文章
- MySQL定义外键的方法
MySQL定义外键的方法是每个学习MySQL的人都需要掌握的知识,下文就对MySQL定义外键的语句写法进行了详细的阐述,供您参考. 外键为MySQL带来了诸多的好处,下面就为您介绍MySQL定义外键的 ...
- [转贴]从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
一.C语言错误处理方法 1.返回值(if … else语句判断错误) 2.errno(linux 系统调用) 3.goto语句(函数内局部跳转) 4.setjmp.longjmp(Do not use ...
- 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
一.C语言错误处理方法 1.返回值(if … else语句判断错误) 2.errno(linux 系统调用) 3.goto语句(函数内局部跳转) 4.setjmp.longjmp(Do not use ...
- Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决
Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决 I. 概述 1.1 JDBC概念 JDBC(Java Database Connectivity ...
- [置顶] Ajax程序:处理异步调用中的异常(使用Asp.Net Ajax内建的异常处理方法)
无论在Window应用程序,还是Web应用程序以对用户友好的方式显示运行时的异常都是很有必要,尤其对于可能有很多不确定因素导致异常的Web应用程序;在传统的Web开发中,处理异常的方式——设计专门一个 ...
- mysql存储过程中的异常处理
http://www.cnblogs.com/cookiehu/p/4994278.html 定义异常捕获类型及处理方法: DECLARE handler_action HANDLER FOR con ...
- PL/SQL异常处理方法
PL/SQL异常处理方法 1:什么是异常处理: PL/SQL提供一个功能去处理异常,在PL/SQL块中叫做异常处理,使用异常处理我们能够测试代码和避免异常退出. PL/SQL异常信息包含三个部分: ...
- 【转】【MySql】mysql存储过程中的异常处理
定义异常捕获类型及处理方法: DECLARE handler_action HANDLER FOR condition_value [, condition_value] ... statement ...
- Java异常与异常处理简单使用
异常就是程序运行过程中阻止当前方法或作用域继续执行的问题: 任何程序都不能保证完全正常运行,当发生异常时,需要我们去处理异常,特别是一些比较重要的场景,异常处理的逻辑也会比较复杂,比如:给用户提示.保 ...
随机推荐
- C#动态调用webservice方法
摘 自: http://www.hao5191.cn/a/chengxukaifa/c_/20130109/115819.html using System; using System.Collect ...
- Hadoop数据目录迁移
Hadoop数据目录迁移 @(Hadoop) 随着数据的不断导入和增大,原本集群部署的目录磁盘空间不足了,所以要把hadoop存储数据的位置迁移到另外一个巨大的磁盘上,另外的一个用意是将数据和程序分离 ...
- Python绘制直方图 Pygal模拟掷骰子
#coding=utf-8 from random import randint class Die(): """骰子类""" def __ ...
- .css()与.addClass()设置样式的区别
对于样式的设置,addClass与css方法两者之间有什么区别? 可维护性: .addClass()的本质是通过定义个class类的样式规则,给元素添加一个或多个类.css方法是通过JavaScrip ...
- 使用iOS-QR-Code-Encoder 生成二维码
一:所需类库 iOS-QR-Code-Encoder 官网主页:https://github.com/moqod/iOS-QR-Code-Encoder 导入:QuartzCore.framework ...
- [读后感]spring Mvc 教程框架实例以及系统演示下载
[读后感]spring Mvc 教程框架实例以及系统演示下载 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&qu ...
- 算法笔记_161:算法提高 十进制数转八进制数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 编写函数,其功能为把一个十进制数转换为其对应的八进制数.程序读入一个十进制数,调用该函数实现数制转换后,输出对应的八进制数. 样例输入 9274 样 ...
- 一学就会之ado.net(一)
ado.net十一组用于和数据源进行交互的面向对象类库.数据源能够是数据库也能够是文本文件.excel表格或者XML文件. 简单来说.ado.net就是与不同的数据源进行交互(增删改查)的. ado. ...
- mac下在eclipse中怎样清除/切换svn
1.打开终端,即用户的根文件夹(用户的home文件夹) 进入.subversion下的auth文件夹 localhost:auth brj$ pwd /Users/brj/.subversion/au ...
- Chrome Dev Editor:一个新的JavaScript和Dart IDE
在Google IO 2014期间,一位Google工程师带来了Chrome Dev Editor(CDE).该IDE用于创建面向桌面和移动设备的Chrome应用程序和Web应用程序.CDE支持Jav ...