在MYSQL中编写WHILE循环的正确语法

时间:2020-06-24 19:21:20

标签: mysql sql loops stored-procedures

对于mysql-5.7.30,似乎以下循环语法无效。

mysql> SET @r = 6
    -> SET @i = 3
    -> WHILE @i <= @r DO
    -> BEGIN
    ->    PRINT @i
    -> END WHILE;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @i = 3
WHILE @i <= @r DO
BEGIN
   PRINT @i
END WHILE' at line 2
mysql>

我看到了多种格式,例如WHILE i <= r DO,并且似乎不同的版本在语法上有细微的差别。我该如何解决?

更新:

我什至根据以下答案创建了一个过程,但是正如您所见,它失败了。

mysql> CREATE PROCEDURE dowhile()
    -> BEGIN
    -> DECLARE r INT DEFAULT 4
    -> DECLARE i INT DEFAULT 3
    -> WHILE i <= r DO
    -> SELECT * FROM mdl_user WHERE id=i
    -> END WHILE
    -> END;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE i INT DEFAULT 3
WHILE i <= r DO
SELECT * FROM mdl_user WHERE id=i
mysql>

更新:

使用关于定界符的example,我编写了以下代码,但最后出现了错误。

mysql> DELIMITER //
mysql> CREATE PROCEDURE dowhile()
    -> BEGIN
    -> DECLARE r INT DEFAULT 4;
    -> DECLARE i INT DEFAULT 3;
    -> WHILE i <= r DO
    -> SELECT * FROM mdl_user WHERE id=i;
    -> END WHILE;
    -> END //
ERROR 1044 (42000): Access denied for user 'moodleuser'@'localhost' to database 'moodle'

更新:

以下代码也是错误的。

$ mysql -u moodleuser -p moodle
Enter password:
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE PROCEDURE dowhile()
    -> BEGIN
    -> DECLARE r INT DEFAULT 4;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

2 个答案:

答案 0 :(得分:1)

每个语句末尾都缺少分号。另外,您需要在每次迭代之间增加i(否则这是一个无限循环)。

考虑:

DELIMITER //

CREATE PROCEDURE dowhile()
BEGIN
    DECLARE r INT DEFAULT 4;
    DECLARE i INT DEFAULT 3;
    WHILE i <= r DO
        SELECT * FROM mdl_user WHERE id = i;
        SET i = i + 1;
    END WHILE;
END//

DELIMITER ;

答案 1 :(得分:0)

WHILE这样的流控制语句可以在存储程序中使用。此外,BEGINWHILE中的PRINT用于SQL Server / Sybase,而不是MySQL。

请参阅WHILE的文档