【问题标题】:MySQL error #2014 - Commands out of sync; you can't run this command nowMySQL 错误 #2014 - 命令不同步;你现在不能运行这个命令
【发布时间】: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 stored-procedures


    【解决方案1】:

    来自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 浏览器。一切正常。

    让我认为这不是服务器或数据库问题,而是您使用的工具的问题。

    【讨论】:

    • 9 年多过去了,这仍然很有帮助!
    【解决方案2】:

    你忘了使用'Begin'关键字,在编译过程中MySQL很混乱,这应该可以工作:

    DELIMITER ;;
    Create procedure sp_test()
        BEGIN
           select * from name_table;
        END;;
    DELIMITER ;
    

    【讨论】:

      【解决方案3】:

      假设您在创建存储过程时将其存储在名为mydatabase 的数据库中以调用该过程。转到您的本地主机数据库并:

      CALL mydatabase.sp_test();
      

      sp_test() 是您的过程的名称。

      【讨论】:

      • 我刚试过这个问题,它在数据库服务器上不起作用 服务器:127.0.0.1 via TCP/IP 服务器类型:MariaDB 服务器版本:10.1.13-MariaDB - mariadb.org 二进制分发协议版本: 10 用户:root@localhost 服务器字符集:UTF-8 Unicode (utf8) Web 服务器 Apache/2.4.17 (Win32) OpenSSL/1.0.2d PHP/5.6.20 数据库客户端版本:libmysql - mysqlnd 5.0.11-dev - 20120503 - $Id:76b08b24596e12d4553bd41fc93cccd5bac2fe7a $ PHP 扩展:mysqli 文档 PHP 版本:5.6.20
      【解决方案4】:

      我能够使用 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 是“单任务鲍勃”,他只能做一项工作。

      【讨论】:

        【解决方案5】:

        我在使用 C API 时也遇到过这个问题。

        我找到了上面最后一个例子的解决方案,它谈到了分隔符。

        use my_database;
        DELIMITER $$
        
        CREATE PROCEDURE foo()
        BEGIN
        select 'derp' as 'msg';
        END $$
        
        CALL foo()$$  
        

        我的代码执行一个存储过程,然后测试返回。 我正确使用了 mysql_free_result()。

        由于我没有在过程中添加select子句“into”,所以出现了这个错误。

        上面的最后一个例子也是同样的情况。

        我已经删除了选择,因为没关系。

        亚历克斯

        【讨论】:

          【解决方案6】:

          在调用我正在处理的用户函数时,我刚刚从 phpMYadmin 收到了同样的错误。

          mysql 控制台却说:

          ERROR 1054 (42S22): Unknown column 'latitude' in 'field list'
          

          ...这是绝对正确的,它在字段列表中拼写错误,因此语句引用了一个未定义的变量。

          我不得不得出结论

          #2014 - Commands out of sync; you can't run this command now
          

          来自 phpMYadmin 是一个相当不具体的错误,在很多情况下,即使不是大多数,也只是掩盖了真正的问题,人们不应该花太多时间试图弄明白它。

          【讨论】:

            【解决方案7】:

            你有这个问题显然是因为两个语句同时执行。我发现的唯一解决方法是在 sp 之后关闭连接并在新的连接上执行另一条语句。阅读它here

            【讨论】:

              【解决方案8】:

              这发生在我身上,因为过程中的一个函数返回了一个没有分配给变量的值。

              解决办法是:

              select function .... INTO @XX;
              

              【讨论】:

                【解决方案9】:

                可能的原因是你代码中的mysql客户端不是线程安全的,我在python中调用mysqldb时遇到了同样的错误,我有一个mysql接口,在2个线程中使用,错误发生了。在这种情况下,您需要创建更多的mysql接口以及线程。

                【讨论】:

                  【解决方案10】:
                  【解决方案11】:

                  这个问题似乎有多个来源。在我的情况下,所有发布的答案都不起作用,我发现在我的情况下,我在存储过程中的一个表上进行了选择和更新,同一个表有一个更新触发器,该触发器被触发并将过程发送到无限循环中。一旦发现错误,错误就消失了。

                  在我有一个 select 调用修改表的函数的情况下,我也重现了这个问题。这些类型的递归调用可能会产生问题,这是有道理的。通过更新 tmp 表并在最后从 tmp 表更新原始表解决了这些问题。

                  【讨论】:

                    【解决方案12】:

                    就我而言,我的存储过程中有以下结构:

                    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 //
                    

                    现在已经解决了!

                    【讨论】:

                    • 这对我来说非常有效,只需将新的分隔符放在 DROP 命令的末尾即可。感谢您提供简单的解决方案,虽然我没有解决问题。
                    【解决方案13】:
                    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 ;;
                    

                    【讨论】:

                      【解决方案14】:

                      由于在 Python 中重复使用数据库连接的代码更改,我刚才遇到了这个错误。还原代码为每个 SQL 查询建立数据库连接解决了这个问题。

                      【讨论】:

                        猜你喜欢
                        • 2018-05-24
                        • 2013-04-08
                        • 1970-01-01
                        • 1970-01-01
                        • 2020-04-20
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多