2016-12-15 59 views
1

我有一個如下所示的存儲過程。在遊標聲明之前的更新語句中顯示錯誤。當我刪除遊標語句時,存儲過程正常工作。爲什麼不能有遊標語句之前的更新語句?MySQL SP中的更新聲明顯示缺少結束錯誤

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,缺少結束,但爲什麼?](http://stackoverflow.com/questions/30917086/sql-missing-end-but-why) – Walls

回答

3

找到答案:聲明語句必須在MySQL存儲過程中的任何其他事務語句之前。在回答 SQL, missing end, but why?的第二個評論。