数据库原理及 MySQL 应用 | 程序流程控制
简介: 解决复杂问题不可能通过一个 SQL 语句完成,我们需要执行多个 SQL 操作。流程控制语句的作用就是控制存储过程或存储函数中 SQL 语句的执行顺序,是我们完成复杂操作必不可少的一部分。
流程控制语句是指可以控制程序运行顺序的语句,程序运行顺序主要包括顺序结构、分支结构和循环结构。MySQL 中流程控制语句有 IF 语句、CASE 语句、LOOP 语句、LEAVE 语句、ITERATE 语句、REPEAT 语句和 WHILE 语句等。
01、判断语句
判断语句用来进行条件判断,根据是否满足条件(可包含多个条件),来执行不同的语句。判断语句构成分支结构。MySQL 中常用的判断语句有 IF 和 CASE 两种。
1. IF 语句
IF 语句用来进行条件判断,可根据不同条件执行不同的操作。该语句在执行时首先判断 IF 语句后的条件是否为真,为真则执行 THEN 后的内容,如果为假则继续判断下一个 IF 语句直到条件为真为止,当以上条件都不满足时则执行 ELSE 子句后的内容。IF 语句的基本语法格式如下所示。
语法说明如下。
search_condition 是条件表达式。
statement_list 是当前面的条件表达式为真时执行的 SQL 语句列表。
ELSEIF 子句是可选选项,当前面的条件表达式为假时,用于设定继续判断的下一个 IF 语句。
ELSE 子句是可选选项,用于设定当前面所有条件都不满足时执行的子句。
【例 8-30】在图书销售数据库 booksale 中建立存储过程 getpricelevel1,该存储过程可通过图书编号 bookid 查看图书价格,返回价格和等级,其中价格高于或等于 100 元为 A 级,低于 100 元且高于或等于 70 元为 B 级,低于 70 元且高于或等于 50 元为 C 级,低于 50 元且高于或等于 30 元为 D 级,其余为 E 级,然后调用存储过程查看结果。
执行结果如图 8-13 所示。
■ 图 8-13IF 语句
2. CASE 语句
CASE 语句也是用来进行条件判断的,它提供了多个条件进行选择,可以实现比 IF 语句更复杂的条件判断。CASE 语句的基本语法格式如下所示。
语法说明如下。
case_value 是表示条件判断的变量,决定了哪一个 WHEN 子句会被执行。
when_value 是表示变量的取值,如果某个 when_value 的值与 case_value 变量的值相同,则执行对应的 THEN 关键字后的 statement_list 中的语句。
ELSE 子句是可选选项,用于设定当前面所有条件都不满足时执行的子句。其后的 statement_list 表示当 when_value 的值都不与 case_value 的值相同时的执行语句。
语法说明如下。
search_condition 参数表示条件判断语句。
statement_list 参数表示不同条件的执行语句。
ELSE 子句是可选选项,用于设定当前面所有条件都不满足时执行的子句。
提示
语法 2 与语法 1 不同的是,语法 2 语句中的 WHEN 语句将被逐个执行,直到某个 search_condition 表达式为真,则执行对应 THEN 关键字后面的 statement_list 语句。如果没有条件匹配,ELSE 子句里的语句被执行。CASE 不能用于判断 NULL。
【例 8-31】用 CASE 语句改写例 8-30,建立存储过程 getpricelevel2,然后调用存储过程查看结果。
02、循环语句
循环语句是在符合指定条件的情况下,重复执行某一段代码。循环语句是构成循环结构的一部分。MySQL 中常用的循环语句有 LOOP、REPEAT 和 WHILE 三种。
1. LOOP 语句
LOOP 语句用来实现简单的循环,使系统能够重复执行循环体内的语句列表。与 IF 和 CASE 语句相比,LOOP 只是实现了一个简单的循环,并不进行条件判断。LOOP 语句的基本语法格式如下所示。
语法说明如下。
begin_label 和 end_label 是可选选项,分别是循环开始和结束的标志,该标志必须符合标识符命名规则,且最长为 16 个字符。如果设置了 begin_label,则后面必须带着冒号(:),end_label 可以省略。但如果设置了 end_label,那必须设置 begin_label,且标志名必须相同。
statement_list 表示循环执行的语句。
提示
LOOP 语句本身没有停止循环的语句,必须使用跳转语句 LEAVE 才能停止循环,跳出循环过程,否则会出现死循环。
【例 8-32】在图书销售数据库 booksale 中建立存储过程 sumnumber1,该存储过程可实现 1 到任意数的累加,然后调用存储过程查看结果。
执行结果如图 8-14 所示。
■ 图 8-141 到任意数的累加
声明局部变量 i 并赋初始值为 1,声明局部变量 sum 并赋初始值为 0,然后在 LOOP 语句中判断 i 的值是否大于输入的数值,如果是则输出 num 的值和 sum 的值,然后退出循环;如果不是则将 i 的值累加到 sum 变量中,并对 i 进行加 1,再次执行 LOOP 中的语句。
2. REPEAT 语句
REPEAT 语句可以实现有条件控制的循环,每次语句执行完毕,会对条件表达式进行判断,如果表达式返回值为真,则循环结束,否则重复执行循环中的语句。REPEAT 语句的基本语法格式如下所示。
语法说明如下。
begin_label、end_label 和 statement_list 同 LOOP 语句的同名参数保持一致。
search_condition 是结束循环的条件,满足该条件即条件的返回值为 TRUE 时循环结束。
【例 8-33】用 REPEAT 改写例 8-32,建立存储过程 sumnumber2,然后调用存储过程查看结果。
3. WHILE 语句
WHILE 语句同样可以实现有条件控制的循环。WHILE 语句和 REPEAT 语句不同的是,WHILE 语句是当满足条件时,才执行循环内的语句,否则退出循环。WHILE 语句的基本语法格式如下所示。
语法说明:所有参数同 REPEAT 语句的同名参数保持一致。
【例 8-34】用 WHILE 改写例 8-32,建立存储过程 sumnumber3,然后调用存储过程查看结果。
03、跳转语句
跳转语句用于实现程序执行过程中的流程跳转。MySQL 中常用的跳转语句有 LEAVE 和 ITERATE 两种。跳转语句也是构成循环结构的一部分。
跳转语句的基本语法格式如下所示。
语法说明:label 表示循环的标志。
提示
LEAVE 语句和 ITERATE 语句都用来跳出循环语句,但两者的功能是不一样的。TERATE 语句用于结束本次循环的执行,开始下一轮循环的执行操作,重新开始循环;而 LEAVE 语句用于跳出整个循环,然后执行循环后面的程序。使用这两个语句时一定要区分清楚。
ITERATE 语句只能应用在循环结构 LOOP、REPEAT 和 WHILE 语句中,LEAVE 除可以在循环结构中应用外,还可在 BEGIN…END 中使用。
【例 8-35】对比 LEAVE 和 ITERATE 的使用,然后调用存储过程查看结果。
执行结果如图 8-15 所示。
■ 图 8-15LOOP 语句
声明局部变量 num 并赋初始值为 0,在 LOOP 循环中,当 num 小于 5 时,利用 ITERATE 不执行以下操作,重新开始 LOOP 循环,直到 num 大于 5 时,查看 num 的具体值,并利用 LEAVE 跳出 LOOP 循环。
版权声明: 本文为 InfoQ 作者【TiAmo】的原创文章。
原文链接:【http://xie.infoq.cn/article/4fbafe62c6761e4c0b5c7750f】。文章转载请联系作者。
评论