MySQL——事务与存储过程(二)存储过程的创建(3)定义条件和处理程序

本文主要是介绍MySQL——事务与存储过程(二)存储过程的创建(3)定义条件和处理程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在实际开发中,经常需要对特定的条件进行处理,这些条件可以联系到错误以及子程序中的一般流程控制。定义条件是事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式,并且保证存储过程在遇到警告或错误时能继续执行。接下来将针对定义条件和处理程序进行详细的讲解。

1.定义条件

        在编写存储过程时,定义条件使用 DECLARE语句,语法格式如下:

DECLARE condition_name CONDITION FOR [condition type];
// condition type 的两种形式:
[condition_type]:
SQLSTATE[VALUE] sqlstate value|Mysgl error_code

        上述语法格式中,condition_name表示所定义的条件的名称;condition type 表示条件的类型;sqlstate_value 和 mysql_error_code 都可以表示 MySQL的错误,sqlstatevalue 是长度为5的字符串类型错误代码,mysql_error_code 为数值类型的错误代码。例如:ERROR1142(42000)中,sqlstate_value 的值是 42000,mysql_error_code 的值是 1142。

        上述语法格式指定了需要特殊处理的条件。它将一个名字和指定的错误条件关联起来。这个名字可以随后被用在定义处理程序的 DECLARE HANDLER 语句中。

        例如,定义“ERROR1148(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.定义处理程序

        定义完条件后,还需要定义针对此条件的处理程序。MySQL中用 DECLARE 语句又处理程序,具体语法格式如下:

DECLARE handler_type HANDLER foR condition_valve[,...] sp_statement
handler_type:CONTINUE|EXIT|UNDO
condition_value:|condition name|SQLWARNING|NOT FOUND|SQLEXCEPTION|mysgl_error_code

        上述语法格式中,handler_type 为错误处理方式,参数取三个值:CONTINUE.EXIT 和 UNDO。CONTINUE 表示遇到错误不处理,继续执行;EXIT 表示遇到错误马+退出;UNDO 表示遇到错误后撤回之前的操作,MySQL中暂时不支持这样的操作。.statement 参数为程序语句段,表示在遇到定义的错误时,需要执行的存储过程;wndition_value 表示错误类型,可以有以下取值。

(1)SQLSTATE[VALUE]sqlstate_value 包含5个字符的字符串错误值。

(2)condition_name 表示 DECLARE CONDITION 定义的错误条件名称。

(3)SQLWARNING 匹配所有以 01 开头的 SQLSTATE 错误代码。

(4)NOT FOUND 匹配所有以 02 开头的 SQLSTATE 错误代码。

(5)SQLEXCEPTION 匹配所有没有被 SQLWARNING 或 NOT FOUND 捕获的SQLSTATE 错误代码。
(6)mysql_error_code 匹配数值类型错误代码。

        例如,定义处理程序的几种方式,具体代码如下:

//方法一:捕获 sglstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'SET @info='NO_SUCH_TABLE';//方法二:捕获 mysgl_error_code
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='ERROR';//方法四:使用 SQLWARNING
DECLARE EXIT HANDLER FOR SOLWARNING SET @info='ERROR';//方法五:使用 NOT FOUND
DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE';//方法六:使用 SQLEXCEPTION
DECLARE EXIT HANDLER FOR SOLEXCEPTION SET @info='ERROR';

        上述代码中演示了6种定义处理程序的方法。接下来将分别进行分析讲解,具体如下:

        第一种方法是捕获 salstate_value 值。如果遇到 sqlstate_value 值为“42S02”,则执行 CONTINUE 操作,并且输出“NO_SUCH_TABLE”信息。

        第二种方法是捕获 mysql_error_code 值,如果遇到 mysql_error_code 值为 1146,则执行CONTINUE 操作,并且输出“NO_SUCH_TABLE”信息。

        第三种方法是先定义条件,然后再调用条件。这里先定义 no_such_table 条件,遇到
1146 错误就执行 CONTINUE 操作。

        第四种方法是使用 SQLWARNING,SQLWARNING 捕获所有以 01 开头的sqlstate_value 值,然后执行 EXIT 操作,并且输出“ERROR”信息。

        第五种方法是使用 NOT FOUND,NOT FOUND 捕获所有以 02 开头的 sqlstate_value 值,然后执行 EXIT 操作,并且输出“NO_SUCH_TABLE”信息。

        第六种方法是使用 SQLEXCEPTION,SQLEXCEPTION 捕获所有没有被SQLWARNING 或 NOT FOUND 捕获的 sqlstate_value 值,然后执行 EXIT 操作,并日输出“ERROR”信息。

        例如,定义条件和处理程序,具体执行过程如下:

mysgl> CREATE TABLE test.t(s1 int,primary key(s1));
Query OK, 0 rows affected (0.00 sec)mysqI> DELIMITER //
mysg1> CREATE PROCEDURE demo()-> BEGIN-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;-> SET @x=1;-> INSERT INTO test.t VALUES(1);-> SET @x=2;-> INSERT INTO test.t VALUES (1);-> SET @x=3;-> END; //
Query ok, 0 rows affected (0.01 sec)
mysql> DELIMITER;/*调用存储过程*/
mysql> CALL demo();
Query OK, 0 rows affected (0.00 sec)mysql> SELECT @x;
+------+
| @x   |
+------+
|   3  |
+------+
1 row in set (0.00 sec)

        @x是一个用户变量,执行@x等于3,这表明 MySQL 被执行到程序的末尾。如果,没有"DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;"第二个 INSERT 会因 PRIMARY KEY强制而失败之后,MySQL可能已经采取(EXIT)路径,并且 SELECT @x会返回2。

        需要注意的是,“@var_name”表示用户变量,使用 SET 语句为其赋值,用户变量与有关,一个客户端定义的变量不能被其他客户端看到或使用。当客卢端退出时,该中连接的所有变量将自动释放。

这篇关于MySQL——事务与存储过程(二)存储过程的创建(3)定义条件和处理程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130077

相关文章

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

MySQL错误代码2058和2059的解决办法

《MySQL错误代码2058和2059的解决办法》:本文主要介绍MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,... 目录1. 前置理解2.报错现象3.解决办法(敲重点!!!)1. php前置理解2058和2059的错误

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T