2010-11-01 40 views
0

我有一個使用嵌套集模型的分層MySQL表設置。我創建了一個存儲過程,允許我刪除一個組織。MySQL錯誤2014-命令不同步 - 當試圖調用連續存儲的procs時

當我嘗試進行連續調用的存儲過程,我得到以下錯誤指的是第二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 ; 

爲什麼第二個命令是失敗的?在第一個CALL命令提交之前,MySQL是否嘗試執行第二個CALL命令?在調用第二個之前,我能強制第一個完全執行嗎?

編輯:組織表使用的InnoDB

編輯:試圖消除START TRANSACTION;和COMMIT;但我仍然得到相同的錯誤

+0

您使用的是什麼版本的MySQL? – 2010-11-01 20:23:14

+0

MySQL版本5.1.41 – 2010-11-01 20:24:33

回答

0

該錯誤似乎只是從phpMyAdmin導入SQL腳本時發生。從命令行導入腳本或使用命令行不會導致錯誤。我假設這個錯誤與phpMyAdmin而不是MySQL有關。 (我也看到了其他來自phpMyAdmin的有關存儲過程的奇怪行爲 - 我正在使用phpMyAdmin v3.3.2)

2

我猜這可能與您分配變量的方式有關。

我的建議是在程序中聲明局部變量,並使用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 ; 
0

我在尋找的答案也一樣,據我所知它與由第一SP返回的記錄。您必須「讀取」記錄集將其清空,然後再創建一個新的CALL。

相關問題