LEAVE

LEAVE语句:可以用在循环语句内,或者以 BEGIN 和 END 包裹起来的程序体内,表示跳出循环或者跳出程序体的操作。如果你有面向过程的编程语言的使用经验,你可以把 LEAVE 理解为 break。
基本格式如下:

  1. LEAVE 标记名

其中,label参数表示循环的标志。LEAVE和BEGIN … END或循环一起被使用。

举例1:创建存储过程 “leave_begin()”,声明INT类型的IN参数num。给BEGIN…END加标记名,
并在BEGIN…END中使用IF语句判断num参数的值。

  • 如果num<=0,则使用LEAVE语句退出BEGIN…END;
  • 如果num=1,则查询“emp”表的平均薪资;
  • 如果num=2,则查询“emp”表的最低薪资;
  • 如果num>2,则查询“emp”表的最高薪资。

IF语句结束后查询“emp”表的总人数。

DELIMITER //

CREATE PROCEDURE leave_begin(IN num INT)

begin_label:BEGIN
    IF num <= 0
        THEN LEAVE begin_label;
    ELSEIF num = 1
        THEN SELECT AVG(salary) FROM employees;
    ELSEIF num = 2
        THEN SELECT MIN(salary) FROM employees;
    ELSE 
        SELECT MAX(salary) FROM employees;
    END IF;

    #查询总人数
    SELECT COUNT(*) FROM employees;

END //

DELIMITER ;

调用

CALL leave_begin(1);

举例2:当市场环境不好时,公司为了渡过难关,决定暂时降低大家的薪资。声明存储过程“leave_while()”,声明OUT参数num,输出循环次数,存储过程中使用WHILE循环给大家降低薪资为原来薪资的90%,直到全公司的平均薪资小于等于10000,并统计循环次数。

DELIMITER //
CREATE PROCEDURE leave_while(OUT num INT)

BEGIN 
    #
    DECLARE avg_sal DOUBLE;#记录平均工资
    DECLARE while_count INT DEFAULT 0; #记录循环次数

    SELECT AVG(salary) INTO avg_sal FROM employees; #① 初始化条件

    while_label:WHILE TRUE DO  #② 循环条件

        #③ 循环体
        IF avg_sal <= 10000 THEN
            LEAVE while_label;
        END IF;

        UPDATE employees SET salary  = salary * 0.9;
        SET while_count = while_count + 1;

        #④ 迭代条件
        SELECT AVG(salary) INTO avg_sal FROM employees;

    END WHILE;

    #赋值
    SET num = while_count;

END //

DELIMITER ;

调用

CALL leave_while(@num);
SELECT @num;

SELECT AVG(salary) FROM employees;

ITERATE

ITERATE语句:只能用在循环语句(LOOP、REPEAT和WHILE语句)内,表示重新开始循环,将执行顺序转到语句段开头处。如果你有面向过程的编程语言的使用经验,你可以把 ITERATE 理解为 continue,意思为“再次循环”。
语句基本格式如下:

ITERATE label

abel参数表示循环的标志。ITERATE语句必须跟在循环标志前面。

举例: 定义局部变量num,初始值为0。循环结构中执行num + 1操作。如果num < 10 ,则继续执行循环,如果num > 15 ,则退出循环结构

DELIMITER //

CREATE PROCEDURE test_iterate()

BEGIN
    DECLARE num INT DEFAULT 0;

    loop_label:LOOP
        #赋值
        SET num = num + 1;

        IF num  < 10
            THEN ITERATE loop_label;
        ELSEIF num > 15
            THEN LEAVE loop_label;
        END IF;

        SELECT ' 逝者如斯夫,不舍昼夜';

    END LOOP;

END //

DELIMITER ;

调用


CALL test_iterate();

SELECT * FROM emp;