2014-02-10 48 views
0

試圖創建我的第一個存儲過程,我已經進行了廣泛的研究,找不到通過phpMyAdmin輸入代碼的方式,因此下載了MYSQL Workbench 6.0並以此方式放置了腳本 - 但它會拋出一個2014 error (Commands out of sync, you cannot run this command now)。但是我注意到Workbench似乎創建了兩行 - 第一行表示正在運行,第二行表示錯誤。創建Mysql存儲過程獲取2014錯誤

例行程序是更新三個表並在發出合同時插入另一個表。合同由捆綁組成,而它們又由與另一個表中的特定問題有關的項目組成。

它是我的代碼還是應該在最後包含一些清除命令,如果是的話應該是什麼?程序輸入是一個合同ID,用戶ID和他們的IP地址(用於記錄)。

在PHP中,當最終使用CALL時,我將如何清除結果,因爲我一直在看第二次調用失敗的Stackoverflow 2014答案。另外我怎麼能通過phpMyAdmin或如果與膩子到哪裏應該我的SQL腳本到SQL Server腳本到ubuntu服務器上?

DELIMITER // 

DROP PROCEDURE IF EXISTS ContrctAwardStatusLog; 

CREATE PROCEDURE ContrctAwardStatusLog(IN c_Id INT(8), IN u_Id INT(11), IN u_Ip varchar(20)) 
BEGIN 
    Block1: BEGIN 
    DECLARE done INT DEFAULT 0; 
    DECLARE b_id INT DEFAULT 0; 
    DECLARE citm_id INT DEFAULT 0; 
    DECLARE r_id INT DEFAULT 0; 
    DECLARE c_1 CURSOR FOR SELECT bundle_id FROM bundles WHERE contract_id = c_Id; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

    OPEN c_1; 
    REPEAT 
     FETCH c_1 INTO b_id ; 

     Block2: BEGIN 
     DECLARE done2 INT DEFAULT 0; 
     DECLARE c_2 CURSOR FOR SELECT contitem_id, issue_id FROM c_items WHERE bundle_id= b_id; 
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2 = 1; 

     OPEN c_2; 
     REPEAT 
      FETCH c_2 INTO citm_id r_id; 
      INSERT INTO track_status (rowid, WStatusBy, WStatus, WStatusWhen) VALUES(r_id, u_Id, 13,NOW()); 
      UPDATE h_issues SET WStatus='13' WHERE RowID = r_id; 
      UPDATE c_items SET act_state='13' WHERE contitem_id=citm_id; 

      UNTIL done2 
     END REPEAT; 
     CLOSE c_2; 
     END Block2; 

     UPDATE bundles SET bundle_stat = '13' WHERE bundle_id = b_id; 
     UNTIL done 
    END REPEAT; 

    CLOSE c_1; 
    END Block1; 

END // 

DELIMITER ; 

回答

0

我終於自己排序了。

我需要把DROP ..if存在DELIMITER設置之前,並且在OPEN c_2之後FETCH中出現語法錯誤。它缺少一個逗號分隔符。

DROP PROCEDURE IF EXISTS ContrctAwardStatusLog; 

DELIMITER // 

CREATE PROCEDURE ContrctAwardStatusLog(IN c_Id INT(8), IN u_Id INT(11), IN u_Ip varchar(20)) 
BEGIN 
    Block1: BEGIN 
    DECLARE done INT DEFAULT 0; 
    DECLARE b_id INT DEFAULT 0; 
    DECLARE citm_id INT DEFAULT 0; 
    DECLARE r_id INT DEFAULT 0; 
    DECLARE c_1 CURSOR FOR SELECT bundle_id FROM bundles WHERE contract_id = c_Id; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

    OPEN c_1; 
    REPEAT 
     FETCH c_1 INTO b_id ; 

     Block2: BEGIN 
     DECLARE done2 INT DEFAULT 0; 
     DECLARE c_2 CURSOR FOR SELECT contitem_id, issue_id FROM c_items WHERE bundle_id= b_id; 
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2 = 1; 

     OPEN c_2; 
     REPEAT 
      FETCH c_2 INTO citm_id, r_id; 
      INSERT INTO track_status (rowid, WStatusBy, WStatus, WStatusWhen) VALUES(r_id, u_Id, 13,NOW()); 
      UPDATE h_issues SET WStatus='13' WHERE RowID = r_id; 
      UPDATE c_items SET act_state='13' WHERE contitem_id=citm_id; 

      UNTIL done2 
     END REPEAT; 
     CLOSE c_2; 
     END Block2; 

     UPDATE bundles SET bundle_stat = '13' WHERE bundle_id = b_id; 
     UNTIL done 
    END REPEAT; 

    CLOSE c_1; 
    END Block1; 

END // 

DELIMITER ; 
+0

'DROP ..'語句也可以定義新的'delimiter'後在那裏。但是爲了強制這個drop被提前執行,你應該使用新的分隔符來關閉drop語句。 –

+0

我刪除了我的答案,因爲它確實沒有選擇導致錯誤的語句。 –