2016-04-29 61 views
1

我正在寫一個程序來循環通過各種昆蟲收集器,其中一些被逗號分開,例如。 「V. Shirey,L. Smith」,我需要爲每個收藏家創建一個新的行。我的過程是這樣的:因爲它是在調用這個存儲函數/觸發的語句中使用MySQL錯誤1442:無法更新表,但表未被引用?

DROP PROCEDURE IF EXISTS agent_reclamation; 
DELIMITER // 
CREATE PROCEDURE agent_reclamation (IN VerbatimName VARCHAR(170)) 
BEGIN 
DECLARE verbatimNameHandler varchar(170); 
DECLARE tempAgentName varchar(170); 
SET verbatimNameHandler = VerbatimName; 
    WHILE LENGTH(verbatimNameHandler) > 0 DO -- while there's more stuff left 
     IF LOCATE(',', verbatimNameHandler) > 0 THEN -- and theres a comma to be found 
      SET tempAgentName = SUBSTRING(verbatimNameHandler,1,LOCATE(',',verbatimNameHandler) - 1); -- set the temp variable to everything from the first character to the first comma 
     ELSE 
      SET tempAgentName = verbatimNameHandler; -- set the name if there are no commas 
      SET verbatimNameHandler = ''; -- won't accept procedure without update -- 
     END IF; 
      INSERT INTO agentReclamation SET tempAgentName = tempAgentName; 
     /* INSERT INTO agentReclamation(tempAgentName) VALUES (tempAgentName); */ -- insert the new names into the agentReclamation table 
     SET verbatimNameHandler = REPLACE(verbatimNameHandler, tempAgentName + ',', ''); -- won't accept procedure without update -- 
    END WHILE; 
END // 

DELIMITER ; 

SELECT agent_reclamation(VerbatimName) FROM tempAgent WHERE VerbatimName LIKE 
'%,%'; 

我得到錯誤陳述1442,不能在存儲函數/觸發更新表「tempAgent」。我看不到自己在哪裏定位自己,以隨程序更新「tempAgent」。

任何幫助,將不勝感激,我只是得到編寫我自己的程序目前的吊銷。謝謝!

+0

在'agentReclamation'表上沒有觸發器,它對錶'tempAgent'做了些什麼? –

+0

@ j.kaspar它看起來像他對tempAgent表的唯一引用在存儲過程定義之外。 Vaughn,你能在存儲過程之外運行一個類似的插入嗎? – Uueerdo

+0

@Uueerdo,我在程序之外運行插入罰款 - 我其實剛剛解決了這個問題。我最終需要2個過程:一個是我定義一個遊標並循環遍歷每一行,同時調用agent_reclamation過程和agent_reclamation過程本身。這裏的主要犯罪者之一是試圖在選擇聲明中調用一個程序。 –

回答

0

我所做的是創建兩個過程,其中一個是通過對原始過程的過程調用對每一行進行迭代。見下:

DROP PROCEDURE IF EXISTS agent_reclamation; 
DROP PROCEDURE IF EXISTS procIteration; 
DELIMITER // 

CREATE PROCEDURE procIteration() 
BEGIN 
DECLARE done BOOLEAN DEFAULT FALSE; 
DECLARE verbatimNameHandler varchar(170); 
DECLARE cur CURSOR FOR SELECT VerbatimName FROM tempAgent WHERE VerbatimName LIKE '%,%'; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE; 

OPEN cur; 

testLoop: LOOP 
    FETCH cur INTO verbatimNameHandler; 
    IF done THEN 
     LEAVE testLoop; 
    END IF; 
    CALL agent_reclamation(verbatimNameHandler); 
END LOOP testLoop; 

CLOSE cur; 
END // 

CREATE PROCEDURE agent_reclamation (IN VerbatimName VARCHAR(170)) 
BEGIN 
DECLARE verbatimNameHandler varchar(170); 
DECLARE tempAgentName varchar(170); 
SET verbatimNameHandler = VerbatimName; 
    WHILE LENGTH(verbatimNameHandler) > 0 DO -- while there's more stuff left 
     IF LOCATE(',', verbatimNameHandler) > 0 THEN -- and theres a comma to be found 
      SET tempAgentName = SUBSTRING(verbatimNameHandler,1,LOCATE(',',verbatimNameHandler) - 1); -- set the temp variable to everything from the first character to the first comma 
     ELSE 
      SET tempAgentName = verbatimNameHandler; -- set the name if there are no commas 
      SET verbatimNameHandler = ''; -- won't accept procedure without update -- 
     END IF; 
     -- INSERT INTO agentReclamation SET tempAgentName = tempAgentName; 
     INSERT INTO agentReclamation(tempAgentName) VALUES (tempAgentName); -- insert the new names into the agentReclamation table 
     SET verbatimNameHandler = REPLACE(verbatimNameHandler, CONCAT(tempAgentName, ','), ''); -- won't accept procedure without update -- 
    END WHILE; 
END // 

DELIMITER ; 

CALL procIteration(); 

這產生了預期的結果。