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 中调用存储过程时,您现在无法运行此命令
Mysql + django 异常:“命令不同步;您现在无法运行此命令”