leave

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

语法

  1. LEAVE 标记名

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

例子

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

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

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

  1. DELIMITER //
  2. CREATE PROCEDURE leave_begin(IN num INT)
  3. begin_label:BEGIN
  4. IF num <= 0
  5. THEN LEAVE begin_label;
  6. ELSEIF num = 1
  7. THEN SELECT AVG(salary) FROM employees;
  8. ELSEIF num = 2
  9. THEN SELECT MIN(salary) FROM employees;
  10. ELSE
  11. SELECT MAX(salary) FROM employees;
  12. END IF;
  13. #查询总人数
  14. SELECT COUNT(*) FROM employees;
  15. END //
  16. DELIMITER ;
  17. #调用
  18. CALL leave_begin(1);

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

  1. DELIMITER //
  2. CREATE PROCEDURE leave_while(OUT num INT)
  3. BEGIN
  4. #
  5. DECLARE avg_sal DOUBLE;#记录平均工资
  6. DECLARE while_count INT DEFAULT 0; #记录循环次数
  7. #① 初始化条件
  8. SELECT AVG(salary) INTO avg_sal FROM employees;
  9. while_label:WHILE TRUE DO #② 循环条件
  10. #③ 循环体
  11. IF avg_sal <= 10000 THEN
  12. LEAVE while_label;
  13. END IF;
  14. UPDATE employees SET salary = salary * 0.9;
  15. SET while_count = while_count + 1;
  16. #④ 迭代条件
  17. SELECT AVG(salary) INTO avg_sal FROM employees;
  18. END WHILE;
  19. #赋值
  20. SET num = while_count;
  21. END //
  22. DELIMITER ;
  23. #调用
  24. CALL leave_while(@num);
  25. SELECT @num;
  26. SELECT AVG(salary) FROM employees;

iterate

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

语法

  1. ITERATE label

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

例子

定义局部变量num,初始值为0。循环结构中执行num + 1操作。

  • 如果num < 10,则继续执行循环;
  • 如果num > 15,则退出循环结构; ```sql DELIMITER //

CREATE PROCEDURE test_iterate()

BEGIN DECLARE num INT DEFAULT 0;

  1. loop_label:LOOP
  2. #赋值
  3. SET num = num + 1;
  4. IF num < 10
  5. THEN ITERATE loop_label;
  6. ELSEIF num > 15
  7. THEN LEAVE loop_label;
  8. END IF;
  9. SELECT '呵呵哒~';
  10. END LOOP;

END //

DELIMITER ;

CALL test_iterate();

SELECT * FROM employees; ```