MySQL定义异常和异常处理方法

摘要:
特定的异常需要特定的处理。定义异常是预先定义程序运行过程中遇到的问题,而异常处理定义了遇到问题时应该采取的处理方法。假设您遇到MySQL_error_当代码值为1146时,运行CONTINUE操作并输出“NO_SUCH_TABLE”信息;DECLARECONTINUEHANDLERFOR1146SET@info='NO_SUCH_表格';//方法3:首先定义条件,然后捕获异常DECLAREno_such_tableCONDITIONFOR1146;DECLARECONTINUEHANDLERFORNO_SUCH_TABLESET@info='NO_SUCH_表格';//方法4:使用SQLWARNING捕获异常DECLAREEXITHANDLERFORSQLWARNINGSET@info=“错误”;//方法5:使用NOTFOUND捕获异常DECLAREEXITHANDLERFORNOTFOUNDSET@info='NO_SUCH_表格';//方法6:使用SQLEXCEPTION捕获异常DECLAREEXITHANDLERFORSQLEXCEPTIONSET@info=“错误”;3.综合演示示例创建一个表,设置该表的主键,并在不定义异常处理和异常处理的情况下查看要运行的步骤。

在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定义异常和异常处理方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇机器不学习:基于知识图谱推理的关系推演.net ServiceStack.Redis 性能调优下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL5.7 的新特点

1、安全性 MySQL 5.7 的目标是成为发布以来最安全的 MySQL 服务器,其在 SSL/TLS 和全面安全开发方面有一些重要的改变。 mysql.user表结构升级 MySQL5.7用户表mysql.user的plugin字段不允许为空,默认值是mysql_native_password,而不是mysql_old_password,不再支持旧密码格...

phpstudy安装好之后mysql无法启动(亲测可行)

安装好phpstudy后,Apache可以启动,Mysql无法启动。 尝试解决办法:可能是之前已经装过Mysql,要把系统服务里面的MySQL删除,留下MySQLa服务。 在cmd命令行下输入:sc delete mysql 即可删除。...

Asp.net mvc与PHP的Session共享的实现

最近在做的一个ASP.NET MVC的项目,要用到第三方的php系统,为了实现两个系统的互联互通。决定将两者的session打通共享。让asp.net mvc 和php 都能正常访问和修改Session内容。 在决定实现之前,先搜索了一下院子里有没有相类似的文章,对于跨语言的程序互通,有两种方案: (1) SSO单点登录,其实就是把用户名和密码传给另一个系...

缓存的应用场景以及要注意的问题

什么是缓存(cache): 在项目中没有必要每次请求都查询数据库的情况就可以使用缓存,让每次请求先查询缓存,如果命中,就直接返回缓存结果,如果没有命中,就查询数据库, 并将查询结果放入缓存,下次请求时查询缓存命中,直接返回结果,就不用再次查询数据库。 缓存的作用? 缓和较慢存储的高频请求,缓解数据库压力,提升响应速率。 为什么缓存可以提高响应速度? 因为缓...

MySQL DBA MySQL复制技术的变革(九)

复制环境搭建:基于ROW+GTID statement格式复制不足及解决办法 GTID用于解决什么问题 半同步复制有什么缺点?增强半同步用于解决什么问题?半同步会不会有延迟? 复制的瓶颈点及改进建议 复制建议选择     statement格式复制不足 理解binlog 记录最小的单位是一个Event。前4个字节是magic number,接下来的19个字...

Vue3.x 推荐使用 mitt.js

Vue2.x 使用 EventBus 进行组件通信,而 Vue3.x 推荐使用 mitt.js。 比起 Vue 实例上的 EventBus,mitt.js 好在哪里呢?首先它足够小,仅有200bytes,其次支持全部事件的监听和批量移除,它还不依赖 Vue 实例,所以可以跨框架使用,React 或者 Vue,甚至 jQuery 项目都能使用同一套库。 快...