流程控制的使用

1. 光标的使用(游标)

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

  在存储过程和函数中可以使用光标对结果集进行循环的处理,光标使用包括光标的声明,open ,fetch,close。
  下面在存储过程中使用一个光标, 这个举例中光标里的逻辑不重要, 重点在于如何使用光标:

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

SELECT city_id FROM test.city

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 va1 IS NULL

    THEN SELECT 'va1 is NULL';

    ELSE SELECT 'va1 is  not NULL';

END IF;

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

图片 1

  图片 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值的执行语句。

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

CASE va1

    WHEN 1 THEN SELECT 'va1 is 1';

    WHEN 2 THEN SELECT 'va1 is 2';

    ELSE SELECT 'va1 is not 1 or 2';

END CASE;

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

图片 3

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来终止。

DELIMITER $$
CREATE PROCEDURE proc_demo_cursor()
BEGIN
    -- 定义变量,获取光标中的数据
        DECLARE city_id_staff SMALLINT DEFAULT 0;

    -- 声明光标
    DECLARE cur_city CURSOR FOR SELECT city_id FROM test.city;

    -- 定义条件  没有找到数据时退出光标 NOT FOUND CLOSE cur_city
    DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur_city;    

    SET  @result=0;

    -- 打开光标
    OPEN cur_city;
    REPEAT
    FETCH  cur_city INTO city_id_staff;
         IF city_id_staff < 10 THEN 
         SET @result=@result+1;
         ELSE 
         SET @result=@result+2;
         END IF;
    UNTIL 0 END REPEAT;

    -- 关闭光标
    CLOSE cur_city;
END $$
DELIMITER ;

-- 调用
CALL proc_demo_cursor;
SELECT @result;

LOOP语句

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

[loop_label:]LOOP

    statement_list

END LOOP  [loop_label]

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

【例6-8】使用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

2. 流程控制

ITERATE语句

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

ITERATE label

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

【例6-9】演示了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 //

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

  包括 if ,case, loop, leave, iterate, repeat, while 语句进行流程控制

REPEAT语句

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

[repeat_label:] REPEAT

    statement_list

UNTIL expr_condition

END REPEAT [repeat_label]

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

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

DECLARE id INT DEFAULT 0;

    REPEAT

    SET id=id+1;

    UNTIL id>=10;

END REPEAT;

2.1  IF 语句

WHILE语句

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

[while_label:] WHILE expr_condition DO

    Statement_list

END WHILE [while_label]

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

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

DECLARE i INT DEFAULT 0;

WHILE i<10 DO

SET i=i+1;

END WHILE;

--  语法如下
IF search_condition THEN statement_list
[ELSE IF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
-- 举例
IF city_id_staff < 10 THEN 
    SET @result=@result+1;
ELSE 
    SET @result=@result+2;
END IF;

2.2 CASE 语句

--  举例二种用法
CASE
WHEN i_staff_id = 2 THEN
    SET @x1 = @x1 + d_amount;
ELSE
    SET @x2 = @x2 + d_amount;
END CASE;
-- 或者:
CASE i_staff_id
WHEN 2 THEN
    SET @x1 = @x1 + d_amount;
ELSE
    SET @x2 = @x2 + d_amount;
END CASE;

2.3  loop 语句

   loop 实现简单的循环,退出循环条件可以使用leave语句。

本文由金沙官网线上发布于数据库,转载请注明出处:流程控制的使用

您可能还会对下面的文章感兴趣: