1月阅读周·MySQL数据库入门:存储过程的创建之定义条件和处理程序篇

举报
叶一一 发表于 2025/01/24 11:41:16 2025/01/24
【摘要】 背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十二个月。已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScr...

背景

去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。

没有计划的阅读,收效甚微。

新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。

这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十二个月。

已读完书籍《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》、《JavaScript权威指南》、《JavaScript异步编程设计快速响应的网络应用》、《编写可测试的JavaScript代码

当前阅读周书籍MySQL数据库入门

定义条件和处理程序

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

1.定义条件

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

DECLARE condition_name CONDITION FOR [condition_type];
// condition_type的两种形式:
[condition_type]:
SQLSTATE[VALUE] sqlstate_value|mysql_error_code

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

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

【例1-1】 定义“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_value[,…] sp_statement
handler_type:
CONTINUE|EXIT|UNDO
condition_value:
|condition_name
|SQLWARNING
|NOT FOUND
|SQLEXCEPTION
|mysql_error_code

上述语法格式中,handler_type为错误处理方式,参数取三个值:CONTINUE、EXIT和UNDO。CONTINUE表示遇到错误不处理,继续执行;EXIT表示遇到错误马上退出;UNDO表示遇到错误后撤回之前的操作,MySQL中暂时不支持这样的操作。sp_statement参数为程序语句段,表示在遇到定义的错误时,需要执行的存储过程;condition_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匹配数值类型错误代码。

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

//方法一: 捕获sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'SET @info='NO_SUCH_TABLE';

//方法二: 捕获mysql_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 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';

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

第一种方法是捕获sqlstate_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”信息。

【例1-3】 定义条件和处理程序,具体执行过程如下:

mysql>CREATE TABLE test.t(s1 int,primary key(s1));
Query OK, 0 rows affected (0.44 sec)

mysql>DELIMITER //
mysql>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.09 sec)
mysql>DELIMITER;

/*调用存储过程*/
mysql>CALL demo();
Query OK, 0 rows affected (0.08 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引入了存储过程。存储过程就是一条或多条SQL语句的集合,当对数据库进行一系列复杂操作时,存储过程可以将这些复杂操作封装成一个代码块,以便重复使用,大大减少数据库开发人员的工作量。

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


作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏️ | 留言📝

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。