2016-12-15 1 views
1

다음과 같은 저장 프로 시저가 있습니다. 커서 선언 전에 update 문에 오류가 표시됩니다. 커서 문을 제거하면 저장 프로 시저가 올바르게 작동합니다. 커서 문 앞에 update 문을 사용할 수없는 이유는 무엇입니까?MySQL SP의 update 명령문에 누락 된 최종 오류가 표시됩니다.

DROP PROCEDURE IF EXISTS GenerateAlert; 
DELIMITER $$ 
CREATE PROCEDURE GenerateAlert() 
BEGIN 
    DECLARE done INTEGER DEFAULT FALSE; 
    DECLARE temp_project_id INT DEFAULT 0; 
    DECLARE temp_finish_time DATETIME DEFAULT NOW(); 
    DECLARE _message_class INT DEFAULT 3; 
    DECLARE proj_user_id INT DEFAULT 0; 


    -- get message text template 
    DECLARE message_template VARCHAR(255) DEFAULT 
    (
     SELECT alert_message_template FROM alerts WHERE id = 6 
    ); 



    -- get maximum allowed minutes 
    DECLARE allowed_time INT DEFAULT 
    (
     SELECT alert_value_1 FROM alerts WHERE id = 4 
    ); 

    -- flag all messages with class 3 to deleted = true 
    UPDATE messages 
    SET is_deleted = 1 
    WHERE messages_class = 3; 

    DECLARE _cur CURSOR FOR 
     SELECT d.project_id, MAX(finish_time) 
     FROM 
      client_docs AS d INNER JOIN 
      issues AS i ON d.project_id = i.project_id INNER JOIN 
      working_times AS t ON i.id = t.issue_id 
     WHERE 
      d.status = 1 AND 
      t.finish_time IS NOT NULL AND 
      t.category = 1 
     GROUP BY d.project_id; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN _cur; 
    read_loop: LOOP 

     FETCH _cur INTO temp_project_id, temp_finish_time; 

     IF done THEN 
      LEAVE read_loop; 
     END IF; 

     -- add more minutes to finish time 
     SET temp_finish_time = DATE_ADD(temp_finish_time, INTERVAL allowed_time MINUTE); 

     IF temp_finish_time < NOW() THEN 

       -- this project must be alerted 

       -- get project user 
       SELECT c.staff INTO proj_user_id 
       FROM 
        projects AS p INNER JOIN 
        clients AS c ON p.client_id = c.id 
       WHERE 
        p.id = temp_project_id; 





     END IF; 

    END LOOP read_loop; 
    CLOSE _cur; 


END 
$$ 
DELIMITER ; 
+0

가능한 복제본 [SQL, missing end, but?] (http://stackoverflow.com/questions/30917086/sql-missing-end-but-why) – Walls

답변

3

답변 찾기 : 선언문은 MySQL 저장 프로 시저의 다른 트랜잭션 명령문보다 먼저 나와야합니다. SQL, missing end, but why? 답안에서 두 번째 주석.