在 MYSQL 中编写 WHILE 循环的正确语法
Correct syntax for writing WHILE loop in MYSQL
使用 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
像WHILE
这样的流程控制语句可以在存储程序中使用。另外 WHILE
中的 BEGIN
和 PRINT
用于 SQL Server / Sybase,而不是 MySQL.
请参阅 WHILE
的文档
您在每个语句的末尾缺少分号。此外,您需要在每次迭代之间递增 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 ;
使用 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
像WHILE
这样的流程控制语句可以在存储程序中使用。另外 WHILE
中的 BEGIN
和 PRINT
用于 SQL Server / Sybase,而不是 MySQL.
请参阅 WHILE
的文档您在每个语句的末尾缺少分号。此外,您需要在每次迭代之间递增 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 ;