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表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】