【发布时间】:2021-06-11 01:25:24
【问题描述】:
我正在使用 MySQL,我正在定义一个这样的存储过程:
delimiter ;;
Create procedure sp_test()
select * from name_table;
end
当我尝试执行该过程时,我收到此错误:
#2014 - Commands out of sync; you can't run this command now
这是什么意思,我做错了什么?
【问题讨论】:
我正在使用 MySQL,我正在定义一个这样的存储过程:
delimiter ;;
Create procedure sp_test()
select * from name_table;
end
当我尝试执行该过程时,我收到此错误:
#2014 - Commands out of sync; you can't run this command now
这是什么意思,我做错了什么?
【问题讨论】:
来自Manual
C.5.2.14。命令不同步
如果您在客户端代码中得到Commands out of sync; you can't run this command now,则您正在调用客户端 功能顺序错误。例如,如果您使用
mysql_use_result()和 在调用mysql_free_result()之前尝试执行新查询。 如果您尝试执行两个返回数据的查询,也会发生这种情况 中间不调用mysql_use_result()或mysql_store_result()。
这篇文章(取自here)
我已经解决了这个问题。我使用 MySQL-Fron 而不是 MySQL Query 浏览器。一切正常。
让我认为这不是服务器或数据库问题,而是您使用的工具的问题。
【讨论】:
你忘了使用'Begin'关键字,在编译过程中MySQL很混乱,这应该可以工作:
DELIMITER ;;
Create procedure sp_test()
BEGIN
select * from name_table;
END;;
DELIMITER ;
【讨论】:
假设您在创建存储过程时将其存储在名为mydatabase 的数据库中以调用该过程。转到您的本地主机数据库并:
CALL mydatabase.sp_test();
sp_test() 是您的过程的名称。
【讨论】:
我能够使用 MySQL 和 phpmyadmin 重现此错误:
#2014 - Commands out of sync; you can't run this command now
在这个版本的 MySQL 上:
el@apollo:~$ mysql --version
mysql Ver 14.14 Distrib 5.5.34, for debian-linux-gnu (x86_64) using readline 6.2
通过 phpmyadmin 查询窗口运行以下 SQL:
use my_database;
DELIMITER $$
CREATE PROCEDURE foo()
BEGIN
select 'derp' as 'msg';
END $$
CALL foo()$$ <----Error happens here, with or without delimiters.
我无法通过 MySQL 终端发生错误,所以我认为这是 phpmyadmin 的错误。
在终端上运行良好:
mysql> delimiter $$
mysql> use my_database$$ create procedure foo() begin select 'derp' as 'msg'; end $$ call foo() $$
Database changed
Query OK, 0 rows affected (0.00 sec)
+------+
| msg |
+------+
| derp |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
我认为该错误与更改 phpmyadmin 中查询中的分隔符有关。
解决方法:慢下来,牛仔,在使用 phpmyadmin 时一次运行一条 SQL 语句。 phpmyadmin 是“单任务鲍勃”,他只能做一项工作。
【讨论】:
我在使用 C API 时也遇到过这个问题。
我找到了上面最后一个例子的解决方案,它谈到了分隔符。
use my_database;
DELIMITER $$
CREATE PROCEDURE foo()
BEGIN
select 'derp' as 'msg';
END $$
CALL foo()$$
我的代码执行一个存储过程,然后测试返回。 我正确使用了 mysql_free_result()。
由于我没有在过程中添加select子句“into”,所以出现了这个错误。
上面的最后一个例子也是同样的情况。
我已经删除了选择,因为没关系。
亚历克斯
【讨论】:
在调用我正在处理的用户函数时,我刚刚从 phpMYadmin 收到了同样的错误。
mysql 控制台却说:
ERROR 1054 (42S22): Unknown column 'latitude' in 'field list'
...这是绝对正确的,它在字段列表中拼写错误,因此语句引用了一个未定义的变量。
我不得不得出结论
#2014 - Commands out of sync; you can't run this command now
来自 phpMYadmin 是一个相当不具体的错误,在很多情况下,即使不是大多数,也只是掩盖了真正的问题,人们不应该花太多时间试图弄明白它。
【讨论】:
你有这个问题显然是因为两个语句同时执行。我发现的唯一解决方法是在 sp 之后关闭连接并在新的连接上执行另一条语句。阅读它here。
【讨论】:
这发生在我身上,因为过程中的一个函数返回了一个没有分配给变量的值。
解决办法是:
select function .... INTO @XX;
【讨论】:
可能的原因是你代码中的mysql客户端不是线程安全的,我在python中调用mysqldb时遇到了同样的错误,我有一个mysql接口,在2个线程中使用,错误发生了。在这种情况下,您需要创建更多的mysql接口以及线程。
【讨论】:
【讨论】:
这个问题似乎有多个来源。在我的情况下,所有发布的答案都不起作用,我发现在我的情况下,我在存储过程中的一个表上进行了选择和更新,同一个表有一个更新触发器,该触发器被触发并将过程发送到无限循环中。一旦发现错误,错误就消失了。
在我有一个 select 调用修改表的函数的情况下,我也重现了这个问题。这些类型的递归调用可能会产生问题,这是有道理的。通过更新 tmp 表并在最后从 tmp 表更新原始表解决了这些问题。
【讨论】:
就我而言,我的存储过程中有以下结构:
DELIMITER //
DROP PROCEDURE IF EXISTS processcolumns;
CREATE PROCEDURE processcolumns ()
BEGIN
(...)
END //
DELIMITER ;
CALL processcolumns ();
DROP PROCEDURE processcolumns;
问题出在此处:DROP PROCEDURE IF EXISTS processcolumns;
我删除了分号 ; 并用分隔符 // 替换它,如下所示:
DROP PROCEDURE IF EXISTS processcolumns //
现在已经解决了!
【讨论】:
delimiter ;;
Create procedure sp_test()
select * from name_table;
end ## no end here, must add ;; after end. should be
delimiter ;;
Create procedure sp_test()
select * from name_table;
end ;;
【讨论】:
由于在 Python 中重复使用数据库连接的代码更改,我刚才遇到了这个错误。还原代码为每个 SQL 查询建立数据库连接解决了这个问题。
【讨论】: