【问题标题】:Correct syntax for writing WHILE loop in MYSQL在 MYSQL 中编写 WHILE 循环的正确语法
【发布时间】:2020-06-24 19:21:20
【问题描述】:

对于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 &lt;= 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>

更新:

使用exampleabout分隔符,我写了以下代码,但最后出现错误。

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

【问题讨论】:

    标签: mysql sql loops stored-procedures


    【解决方案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 ;
    

    【讨论】:

    • @mahmood:这段代码在 MySQL 5.,7 上编译得很好,你可以看到in this db fiddle。请完全按照提供的方式运行代码(我刚刚添加了DELIMITER 语句,您似乎缺少这些语句)。
    • 请看pasteboard.co/JeCvTrR.png的图片我认为数据库有问题。但是,当我单独对一个 id 运行 select 查询时,没有问题。
    • @mahmood:这与您提出的问题无关,并且与我提供给您的代码有关...我只能建议接受您认为最有帮助的答案,如果您还有其他问题。
    【解决方案2】:

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

    请参阅WHILE 的文档

    【讨论】:

    • 即使使用该文档,我对DECLARE r INT DEFAULT 6; 的尝试也因语法错误而失败。所以,我对语法感到困惑。
    • 你是直接尝试DECLARE还是在存储过程中尝试?
    • 您需要更改DELIMITER 并在语句末尾使用分号。
    • 对不起,我试过但失败了...请再次查看更新后的帖子。
    • 'moodleuser'@'localhost' 缺少对 moodle 数据库的 CREATE ROUTINE 权限。并且您需要在WHILE 中增加i 变量以避免无限循环)。
    猜你喜欢
    • 2011-03-01
    • 2012-03-29
    • 1970-01-01
    • 2016-11-08
    • 2016-04-02
    • 1970-01-01
    • 2016-02-19
    • 2020-08-14
    相关资源
    最近更新 更多