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

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.