怎么做while循环?

Inq*_*rer 7 mysql stored-procedures mysql-5.6

我们如何在 MySQL 中使用 while 循环?我的测试脚本:

BEGIN
    SELECT 0 INTO @n;
    WHILE @n < 10 DO
    SELECT @n;
    SET @n := @n +1;
    END WHILE;
END;
Run Code Online (Sandbox Code Playgroud)

但它有语法错误。我在标准查询窗口中使用 SQLyog 客户端运行循环。语法错误的形式如下:

错误代码:1064
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在附近使用的正确语法...

我还尝试使用https://dev.mysql.com/doc/refman/5.6/en/while.html提供的 while 循环示例,但它仍然不起作用。

脚本的哪个部分是错误的?(使用 MySQL 5.6。)

我正在尝试对某些数据进行 6 个月的移动平均值,因此我希望 while 循环能够通过循环的每次迭代将“新”6 个月平均值附加到“旧”6 个月平均值上。

oNa*_*are 11

如果没有存储过程,就不能在 SQL 编辑器中执行 for 循环。我MySQL Workbench用来做这个。

一个快速的存储过程应该可以完成这项工作:

DROP PROCEDURE IF EXISTS proc_loop_test;
CREATE PROCEDURE proc_loop_test()
BEGIN
  DECLARE int_val INT DEFAULT 0;
  test_loop : LOOP
    IF (int_val = 10) THEN
      LEAVE test_loop;
    END IF;

    SET int_val = int_val +1;
    SELECT int_val; 
  END LOOP; 
END;
Run Code Online (Sandbox Code Playgroud)


phi*_*l_w 6

只是为了澄清“while”循环确实有效:

正确地说您需要创建一个存储过程(例如不能像在 Oracle 中那样运行匿名块),并且它有时在“通用”SQL 编辑器中不能很好地工作(因为 PL/SQL 并不总是工作或者)

您可以使用 MySQL Workbench,也可以使用命令行:

16:54 [test]:> delimiter $$
16:54 [test]:> create procedure testwhile ()
    -> begin
    ->   declare n int;
    ->   set n:=0;
    ->   while n <10 do
    ->     select n;
    ->     set n := n+1;
    ->   end while;
    -> end;
    -> $$
Query OK, 0 rows affected (0.00 sec)
16:54 [test]:> delimiter ;
16:54 [test]:> call testwhile();
[...]
Run Code Online (Sandbox Code Playgroud)

作为旁注,也可以@variables工作,但它们是会话变量。在这种情况下,我更喜欢本地存储过程变量(在过程范围之外无法看到或修改)