0

我有一个使用嵌套集模型的分层 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;和承诺;但我仍然遇到同样的错误

4

3 回答 3

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 ;
于 2010-11-01T20:42:41.087 回答
0

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

于 2010-11-01T20:39:39.680 回答
-1

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

于 2012-08-10T14:42:18.037 回答