2012-07-06 24 views
1

我正在寫我的第一個過程,併發生錯誤。我已將錯誤減少到刪除行,但不確定原因。有人可以在這裏發現問題嗎?它是變量嗎?MySQL過程不編譯 - 用變量刪除時出錯

DROP PROCEDURE IF EXISTS MPT_PROC; 
DELIMITER $$ 
CREATE PROCEDURE MPT_PROC 
MODIFIES SQL DATA 
BEGIN 

    #-- DECLARE statements 

    DECLARE v_user_id  INT DEFAULT 0; 

    DECLARE no_more_rows BOOLEAN; 
    DECLARE v_loop_cntr  INT DEFAULT 0; 
    DECLARE v_num_rows  INT DEFAULT 0; 

    DECLARE c_userfiles CURSOR 
    FOR 
     SELECT distinct f.user_id 
     FROM MPT_STG_FILEUPLOAD f 
     WHERE f.status = 'A'; #-- Accepted 

     DECLARE CONTINUE HANDLER FOR NOT FOUND 
     SET no_more_rows = TRUE; 

     OPEN c_userfiles; 

     #-- Loop through each user_id found as pending 
     the_loop: LOOP 

      FETCH c_userfiles INTO v_user_id; 

      #-- Break out of the loop if 
      #-- 1) there were no records, or 
      #-- 2) we've processed them all. 
      IF no_more_rows THEN 
       CLOSE c_userfiles; 
       LEAVE the_loop; 
      END IF; 

      DELETE FROM MPT_STG_FILEUPLOAD s 
      WHERE s.user_id = v_user_id; 

      COMMIT; #--Commiting the changes for this user 
     END LOOP the_loop; 

    END IF; 

END 
DELIMITER ; 

回答

1

MySQL不允許您在DELETE語句中爲要刪除的表提供別名。

DELETE FROM MPT_STG_FILEUPLOAD WHERE user_id = v_user_id; 

失去英鎊符號作爲評論分隔符。雙破折號是標記評論開始的標準。它看起來像你有一個無與倫比的END IF接近你的程序結束。

DROP PROCEDURE IF EXISTS MPT_PROC; 
DELIMITER $$ 
CREATE PROCEDURE MPT_PROC 
MODIFIES SQL DATA 
BEGIN 
    DECLARE v_user_id  INT DEFAULT 0; 
    DECLARE no_more_rows BOOLEAN; 
    DECLARE v_loop_cntr  INT DEFAULT 0; 
    DECLARE v_num_rows  INT DEFAULT 0; 

    DECLARE c_userfiles CURSOR 
    FOR 
    SELECT distinct f.user_id 
    FROM MPT_STG_FILEUPLOAD f 
    WHERE f.status = 'A'; -- Accepted 

    DECLARE CONTINUE HANDLER FOR NOT FOUND 
    SET no_more_rows = TRUE; 

    OPEN c_userfiles; 

    -- Loop through each user_id found as pending 
    the_loop: LOOP 

    FETCH c_userfiles INTO v_user_id; 

    -- Break out of the loop if 
    -- 1) there were no records, or 
    -- 2) we've processed them all. 
    IF no_more_rows THEN 
     CLOSE c_userfiles; 
     LEAVE the_loop; 
    END IF; 

    DELETE FROM MPT_STG_FILEUPLOAD s 
    WHERE s.user_id = v_user_id; 

    COMMIT; --Commiting the changes for this user 
    END LOOP the_loop; 

END$$ 
DELIMITER ; 

如果user_id不上MPT_STG_FILEUPLOAD表的主鍵,你的程序可以刪除行不標記爲「已接受」。如果user_id在該表中有兩行,並且其中一行被標記爲接受,而另一行不是。你想刪除兩行嗎?

它看起來像你有兩個變量聲明不被引用任何地方,v_loop_cntrv_num_rows,我建議你評論他們,如果他們不需要。

整個過程可以在單個SQL語句中更高效地完成。

+0

謝謝!我還注意到刪除的別名因某種原因而不被接受...... :) – Leo 2012-07-06 22:09:37

+0

非常好的主意!我現在就這樣做!謝謝。 Leo – Leo 2012-07-06 22:16:32

+0

謝謝Spencer,我不知道如何控制如何在循環中進入下一個值,如果發生異常,你有什麼想法嗎? – Leo 2012-07-06 22:44:24