1月阅读周·MySQL数据库入门:存储过程的创建之流程控制的使用篇

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

背景

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

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

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

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

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

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

流程控制的使用

通过前面的学习,已经了解了创建存储过程时所用到的基本知识,在编写存储过程时还有一个非常重要的部分——流程控制。流程控制语句用于将多个SQL语句划分或组合成符合业务逻辑的代码块。MySQL中的流程控制语句包括:IF语句、CASE语句、LOOP语句、WHILE语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句。

每个流程中可能包含一个单独语句,也可能是使用BEGIN…END构造的复合语句,可以嵌套。接下来将针对存储过程中的流程控制语句逐一详细地讲解。

1.IF语句

IF语句是指如果满足某种条件,就根据判断的结果为TRUE或FALSE执行相应的语句,其语法格式如下:

IF expr_condition THEN statement_list
[ELSEIF expr_condition THEN statement_list]
[ELSE statement_list]
END IF

IF实现了一个基本的条件构造。在上述语法结构中,expr_condition表示判断条件,statement_list表示SQL语句列表,它可以包括一个或多个语句。如果expr_condition求值为TRUE,相应的SQL语句列表就会被执行;如果没有expr_condition匹配,则ELSE子句里的语句列表被执行。

需要注意的是,MySQL中还有一个IF()函数,它不同于这里描述的IF语句。

接下来演示一下IF语句的用法,示例代码如下:

IF val IS NULL
THEN SELECT 'val is NULL';
ELSE SELECT 'val is not NULL';
END IF;

上述代码中,判断val值是否为空,如果val值为空,输出字符串“val is NULL”;否则输出字符串“val is not NULL”。需要注意的是,IF语句都需要使用END IF来结束,不可省略。

2.CASE语句

CASE是另一个进行条件判断的语句,该语句有两种语句格式,第一种格式如下:

CASE case_expr
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]…
[ELSE statement_list]
END CASE

在上述语法格式中,case_expr表示条件判断的表达式,决定了哪一个WHEN子句会被执行;when_value表示表达式可能的值,如果某个when_value表达式与case_expr表达式结果相同,则执行对应THEN关键字后的statement_list中的语句,statement_list表示不同when_value值的执行语句。

【例1-2】 使用CASE流程控制语句的第一种格式,判断val值等于1、等于2,或者两者都不等,语句如下:

CASE val
WHEN 1 THEN SELECT 'val is 1';
WHEN 2 THEN SELECT 'val is 2';
ELSE SELECT 'val is not 1 or 2';
END CASE;

在上述代码中,当val值为1时,输出字符串“val is 1”;当val值为2时,输出字符串“val is 2”;否则输出字符串“val is not 1 or 2”。

CASE语句的第二种格式如下:

CASE
WHEN expr_condition THEN statement_list
[WHEN expr_condition THEN statement_list]
[ELSE statement_list]
END CASE;

需要注意的是,这里讲解的用在存储过程里的CASE语句与“控制流程函数”里描述的SQL CASE表达式中的CASE语句有些不同。存储过程里的CASE语句不能有ELSE NULL子句,并且用END CASE替代END来终止。

3.LOOP语句

LOOP循环语句用来重复执行某些语句,与IF和CASE语句相比,LOOP只是创建一个循环操作的过程,并不进行条件判断。LOOP内的语句一直重复执行直到跳出循环语句。LOOP语句的基本格式如下:

[loop_label:]LOOP
statement_list
END LOOP [loop_label]


上述语法格式中,loop_label表示LOOP语句的标注名称,该参数可以省略;statement_list表示需要循环执行的语句。

【例1-3】 使用LOOP语句进行循环操作,具体代码如下:

DECLARE id INT DEFAULT 0;
add_loop:LOOP
SET id=id+1;
IF id>=10 THEN  LEAVE add_loop;
END IF;
END LOOP add_loop;

例中,循环执行了id加1的操作。当id值小于10时,循环重复执行;当id值大于或者等于10时,使用LEAVE语句退出循环。关于LEAVE语句将在下面进行详细的讲解。

4.LEAVE语句

通过学习LOOP语句的使用可以知道,当不满足循环条件时,需要使用LEAVE语句退出循环。LEAVE语句用于退出任何被标注的流程控制构造,其基本语法格式如下:

LEAVE label

在上述语法结构中,label表示循环的标志。通常情况下,LEAVE语句与BEGIN…END、循环语句一起使用。

5.ITERATE语句

ITERATE的意思是再次循环,ITERATE语句用于将执行顺序转到语句段的开头处。使用ITERATE语句的基本语法格式如下:

ITERATE lable

在上述语法结构中,lable表示循环的标志。需要注意的是,ITERATE语句只可以出现在LOOP、REPEAT和WHILE语句内。

【例1-4】 演示了ITERATE语句在LOOP语句内的使用,具体代码如下:

CREATE PROCEDURE doiterate()
BEGIN
DECLARE p1 INT DEFAULT 0;
my_loop:LOOP
SET p1=p1+1;
IF p1<10 THEN ITERATE my_loop;
ELSEIF p1>20 THEN LEAVE my_loop;
END IF;
SELECT 'p1 is between 10 and 20';
END LOOP my_loop;
END

上述代码中,p1的初始值为0,如果p1的值小于10时,重复执行p1加1的操作;当p1大于或等于10并且小于20时,打印消息“p1 is between 10 and 20”;当p1大于20时,退出循环。

6. REPEAT语句

REPEAT语句用于创建一个带有条件判断的循环过程,每次语句执行完毕之后,会对条件表达式进行判断,如果表达式为真,则循环结束;否则重复执行循环中的语句。REPEAT语句的基本语法格式如下:

[repeat_lable:] REPEAT
statement_list
UNTIL expr_condition
END REPEAT[repeat_lable]

上述语法格式中,repeat_lable为REPEAT语句的标注名称,该参数是可选的;REPEAT语句内的语句或语句群被重复,直至expr_condition为真。

【例1-5】 演示使用REPEAT语句执行循环过程,具体代码如下:

DECLARE id INT DEFAULT 0;
REPEAT
SET id=id+1;
UNTIL id>=10;
END REPEAT;

7. WHILE语句

WHILE语句创建一个带条件判断的循环过程,与REPEAT不同的是,WHILE在语句执行时,先对指定的表达式进行判断,如果为真,则执行循环内的语句,否则退出循环。WHILE语句的基本格式如下:

[while_lable:] WHILE expr_condition DO
Statement_list
END WHILE [while_lable]

在上述语法格式中,while_lable为WHILE语句的标注名称;expr_condition为进行判断的表达式,如果表达式结果为真,WHILE语句内的语句或语句群被执行,直至expr_condition为假,退出循环。

【例1-6】 演示使用WHILE语句进行循环操作,具体代码如下:

DECLARE i INT DEFAULT 0;
WHILE i<10 DO
SET i=i+1;
END WHILE;

总结

在开发过程中,经常会遇到重复使用某一功能的情况,为此,MySQL引入了存储过程。存储过程就是一条或多条SQL语句的集合,当对数据库进行一系列复杂操作时,存储过程可以将这些复杂操作封装成一个代码块,以便重复使用,大大减少数据库开发人员的工作量。

流程控制语句用于将多个SQL语句划分或组合成符合业务逻辑的代码块。MySQL中的流程控制语句包括:IF语句、CASE语句、LOOP语句、WHILE语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句。

每个流程中可能包含一个单独语句,也可能是使用BEGIN…END构造的复合语句,可以嵌套。


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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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