2016-12-15 8 views
1

私は以下のようなストアドプロシージャを持っています。カーソル宣言の前に更新ステートメントにエラーが表示されます。私はカーソルステートメントを削除すると、ストアドプロシージャは正常に動作します。カーソル文の前にupdate文を置くことができないのはなぜですか?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、missing end、しかし、なぜ?](http://stackoverflow.com/questions/30917086/sql-missing-end-but-why)の重複の可能性があります。 – Walls

答えて

3

答えを見つけました:宣言文は、MySQLストアドプロシージャの他のトランザクション文の前に来なければなりません。 SQL, missing end, but why?解答の2番目のコメント。

関連する問題