MySQL  存储过程循环

MySQL循环语句(包括WHILEREPEATLOOP)来根据条件反复运行代码块。

MySQL提供循环语句,允许您根据条件重复执行一个SQL代码块。 MySQL中有三个循环语句:WHILEREPEATLOOP

我们将在以下部分中更详细地检查每个循环语句。

WHILE循环

WHILE语句的语法如下:

WHILE expression DO
statements
END WHILE

WHILE循环在每次迭代开始时检查表达式。 如果expression为TRUE,MySQL将执行WHILEEND WHILE之间的语句,直到expression为FALSE。 WHILE循环称为预先测试条件循环,因为它总是在执行前检查语句的表达式。

下面的流程图说明了WHILE循环语句:

以下是在存储过程中使用WHILE循环语句的示例:

DELIMITER $$
DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
CREATE PROCEDURE test_mysql_while_loop()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255); SET x = 1;
SET str = ''; WHILE x <= 5 DO
SET str = CONCAT(str,x,',');
SET x = x + 1;
END WHILE; SELECT str;
END$$
DELIMITER ;

在上面的test_mysql_while_loop存储过程中:

  • 首先,重复构建str字符串,直到x变量的值大于5
  • 然后,使用SELECT语句显示最终的字符串。

要注意,如果不初始化x变量的值,那么它默认值为NULL。 因此,WHILE循环语句中的条件始终为TRUE,并且您将有一个不确定的循环,这是不可预料的。

下面来测试test_mysql_while_loopstored调用存储过程:

CALL test_mysql_while_loop();

执行上面查询语句,得到以下结果

mysql> CALL test_mysql_while_loop();
+------------+
| str |
+------------+
| 1,2,3,4,5, |
+------------+
1 row in set Query OK, 0 rows affected

REPEAT循环

REPEAT循环语句的语法如下:

REPEAT
statements;
UNTIL expression
END REPEAT

首先,MySQL执行语句,然后评估求值表达式(expression)。如果表达式(expression)的计算结果为FALSE,则MySQL将重复执行该语句,直到该表达式计算结果为TRUE

因为REPEAT循环语句在执行语句后检查表达式(expression),因此REPEAT循环语句也称为测试后循环。

下面的流程图说明了REPEAT循环语句的执行过程:

我们可以使用REPEAT循环语句重写test_mysql_while_loop存储过程,使用WHILE循环语句:

DELIMITER $$
DROP PROCEDURE IF EXISTS mysql_test_repeat_loop$$
CREATE PROCEDURE mysql_test_repeat_loop()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255); SET x = 1;
SET str = ''; REPEAT
SET str = CONCAT(str,x,',');
SET x = x + 1;
UNTIL x > 5
END REPEAT; SELECT str;
END$$
DELIMITER ;

要注意的是UNTIL表达式中没有分号(;)。

执行上面查询语句,得到以下结果

mysql> CALL mysql_test_repeat_loop();
+------------+
| str |
+------------+
| 1,2,3,4,5, |
+------------+
1 row in set Query OK, 0 rows affected

LOOP,LEAVE和ITERATE语句

有两个语句允许您用于控制循环:

  • LEAVE语句用于立即退出循环,而无需等待检查条件。LEAVE语句的工作原理就类似PHP,C/C++,Java等其他语言的break语句一样。
  • ITERATE语句允许您跳过剩下的整个代码并开始新的迭代。ITERATE语句类似于PHPC/C++Java等中的continue语句。

MySQL还有一个LOOP语句,它可以反复执行一个代码块,另外还有一个使用循环标签的灵活性。

以下是使用LOOP循环语句的示例。

CREATE PROCEDURE test_mysql_loop()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255); SET x = 1;
SET str = ''; loop_label: LOOP
IF x > 10 THEN
LEAVE loop_label;
END IF; SET x = x + 1;
IF (x mod 2) THEN
ITERATE loop_label;
ELSE
SET str = CONCAT(str,x,',');
END IF;
END LOOP;
SELECT str;
END;
  • 以上存储过程仅构造具有偶数字符串的字符串,例如2,4,6等。
  • LOOP语句之前放置一个loop_label循环标签。
  • 如果x的值大于10,则由于LEAVE语句,循环被终止。
  • 如果x的值是一个奇数,ITERATE语句忽略它下面的所有内容,并开始一个新的迭代。
  • 如果x的值是偶数,则ELSE语句中的块将使用偶数构建字符串。

执行上面查询语句,得到以下结果

mysql> CALL test_mysql_loop();
+-------------+
| str |
+-------------+
| 2,4,6,8,10, |
+-------------+
1 row in set Query OK, 0 rows affected

最新文章

  1. ffmpeg用法及如何使用fluent-ffmpeg
  2. Mysql 视图 游标 触发器 存储过程 事务
  3. 关于javascript中闭包的理解
  4. TypeScript Modules(模块)
  5. IEnumerable、GetEnumerator、IEnumerator的理解
  6. 待整理-coredump
  7. linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
  8. C++11 能好怎?
  9. bash shell学习-shell script基础 (笔记)
  10. VC++ WIN32 sdk实现按钮自绘详解.
  11. 用VLC搭建流媒体server
  12. TCP/IP协议栈 --- 网络层(IP 首部 和分片)
  13. 后端Nodejs利用node-xlsx模块读取excel
  14. Comparators.sort (转载)
  15. 【搬运工】修改mysql数据库的时区
  16. MT【169】拉格朗日配方
  17. hibernate入门程序
  18. web print
  19. java高级----&gt;Serializable的过程分析
  20. MySQL Innodb Engine -- 文件格式(innodb_file_format)

热门文章

  1. node中处理异步常用的方法,回调函数和events 模块处理异步
  2. 微信小程序封装年月日时分组件
  3. [MSF]server/capture/http_javascript_keylogger键盘记录
  4. Hadoop多租户架构配置
  5. 集合 set
  6. 将BUG管理工具(禅道)部署到服务器(测试服务器、云服务器)
  7. /bin, /sbin &amp; /usr/bin, /usr/sbin &amp; /usr/local/bin, /usr/local/sbin &amp; glibc
  8. oracle 中对查询出来的数据进行切割、截取等操作
  9. Linux环境部署SVN服务器
  10. 关于Hibernate 连接mysql不能自动建表的问题