2016-04-29 1 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» находится вне хранимого определения proc в любом случае. Вон, можете ли вы запустить аналогичную вставку вне хранимой процедуры? – Uueerdo

+0

@Uueerdo, я запустил вставку за пределами процедуры - я на самом деле просто решил проблему. В результате мне потребовалось 2 процедуры: одна, в которой я определяю курсор и прохожу через каждую строку, вызывая процедуру agent_reclamation и процедуру agent_reclamation. Один из главных преступников здесь пытался вызвать процедуру в предложении select. –

ответ

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(); 

Это приводит к предполагаемым результатам.

Смежные вопросы