当前位置: 首页 > news >正文

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 语句为其赋值,用户变量与有关,一个客户端定义的变量不能被其他客户端看到或使用。当客卢端退出时,该中连接的所有变量将自动释放。


http://www.mrgr.cn/news/17008.html

相关文章:

  • 信息学奥赛初赛天天练-81-NOIP2015普及组-完善程序-二分答案、二分查找、中位数、二分边界、二分时间复杂度
  • Redis(13)| 主从复制
  • MySQL——事务与存储过程(二)存储过程的创建(4)光标的使用
  • 【例003】利用MATLAB绘制有趣平面图形
  • 06:【江科大stm32】:定时器输入捕获功能
  • 【Python系列】text二进制方式写入文件
  • Spring数据类型转化
  • Java高级Day35-Properties
  • 计算机毕业设计选题推荐-个人健康档案管理系统-Java/Python项目实战
  • mysql创建数据库和表
  • 如何选择合适的JDK:功能、性能与适用场景的全面解析
  • 《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(2)
  • 有爱听《红楼梦》的程同行吗?Python 对红楼梦音频文件排序
  • NetSuite AI 图生代码
  • AWS MySQL 升级(二)—— MySQL API逻辑同步升级操作步骤
  • c++11新特性-智能指针
  • vue3 setup基本使用
  • 【赵渝强老师】MongoDB的In-Memory存储引擎
  • Docker容器技术详解
  • 阿里云云盘手动扩展方法