MySQL 错误 2014 - 命令不同步 - 尝试调用连续存储过程时

Posted

技术标签:

【中文标题】MySQL 错误 2014 - 命令不同步 - 尝试调用连续存储过程时【英文标题】:MySQL Error 2014 - Commands out of sync - when trying to call consecutive stored procs 【发布时间】:2011-05-03 14:48:17 【问题描述】:

我有一个使用嵌套集模型的分层 mysql 表设置。我创建了一个存储过程,允许我删除一个组织。

当我尝试对存储过程进行连续调用时,我收到以下关于第二个 CALL 命令的错误:

2014 - 命令不同步;你现在不能运行这个命令

这是我正在运行的 SQL:

SELECT @id := id, 
       @parent_id := parent_id 
  FROM organization 
 WHERE name = 'TESTDEAL';

CALL deleteOrg(@id);
CALL deleteOrg(@parent_id);

这是我的存储过程:

DELIMITER $$

CREATE PROCEDURE deleteOrg(IN IN_ID INT)

MODIFIES SQL DATA

BEGIN 

    START TRANSACTION;

    SELECT @org_id := id, 
           @myLeft := lft, 
           @myRight := rgt,  
           @myWidth := rgt - lft + 1 
      FROM organization 
     WHERE id = IN_ID;

    # delete statements for removing roles and other dependencies

    DELETE FROM organization 
     WHERE id = @org_id;

    UPDATE organization 
       SET rgt = rgt - @myWidth 
     WHERE rgt > @myRight;

    UPDATE organization 
       SET lft = lft - @myWidth 
     WHERE lft > @myRight;

    COMMIT;

END;
$$

DELIMITER ;

为什么第二个命令会失败? MySQL 是否在提交第一个 CALL 命令之前尝试执行第二个 CALL 命令?有没有办法在调用第二个之前强制第一个完全执行?

编辑:组织表正在使用 InnoDB

编辑:尝试删除 START TRANSACTION;和承诺;但我仍然遇到同样的错误

【问题讨论】:

你用的是什么版本的 MySQL? 【参考方案1】:

我猜这可能与您分配变量的方式有关。

我的建议是在过程中声明局部变量,并使用SELECT...INTO 分配它们。一般来说,这是一个很好的做法,可能会帮助您解决问题。

您的程序如下所示:

DELIMITER $$

DROP PROCEDURE IF EXISTS deleteOrg $$

CREATE PROCEDURE deleteOrg(IN IN_ID INT)

MODIFIES SQL DATA

BEGIN 
  DECLARE V_ORG_ID INT;
  DECLARE V_MY_LEFT INT;
  DECLARE V_MY_RIGHT INT;
  DECLARE V_MY_WIDTH INT;

    START TRANSACTION;

    SELECT id, 
           lft, 
           rgt, 
           rgt - lft + 1
      into V_ORG_ID, 
           V_MY_LEFT, 
           V_MY_RIGHT,  
           V_MY_WIDTH
      FROM organization 
     WHERE id = IN_ID;

    -- delete statements for removing roles and other dependencies

    DELETE FROM organization 
     WHERE id = V_ORG_ID;

    UPDATE organization 
       SET rgt = rgt - V_MY_WIDTH 
     WHERE rgt > V_MY_RIGHT;

    UPDATE organization 
       SET lft = lft - V_MY_WIDTH 
     WHERE lft > V_MY_LEFT;

COMMIT;

END;
$$

DELIMITER ;

【讨论】:

【参考方案2】:

该错误似乎仅在从 phpMyAdmin 导入 SQL 脚本时发生。从命令行导入脚本或使用命令行不会导致错误。我假设这个错误与 phpMyAdmin 而不是 MySQL 有关。 (我还看到 phpMyAdmin 与存储过程相关的其他奇怪行为 - 我正在使用 phpMyAdmin v3.3.2)

【讨论】:

【参考方案3】:

我也在寻找答案,AFAIK 它与第一个 SP 返回的记录集有关。您必须“读取”记录集以清空它,然后进行新的 CALL。

【讨论】:

以上是关于MySQL 错误 2014 - 命令不同步 - 尝试调用连续存储过程时的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:“命令不同步”错误(C 连接器)

MySQL 错误 - 命令不同步;你现在不能运行这个命令

命令不同步;在 Mysql 中调用存储过程时,您现在无法运行此命令

Mysql + django 异常:“命令不同步;您现在无法运行此命令”

Python Mysql,“命令不同步;您现在无法运行此命令”

mysql数据库同步跳过临时错误[转]