2011-11-19 35 views
1

我搜索了整個網站的答案,但沒有解決我的問題,所以我gona發佈我的錯誤與新線程。在存儲過程中使用光標的語法錯誤

我的代碼,

DELIMITER $$ 

USE `DB`$$ 

DROP PROCEDURE IF EXISTS `GET_Summary`$$ 

CREATE DEFINER=`connect`@`%` PROCEDURE `GET_Summary`(IN pDateFrom DATE,IN pDateTo DATE) 

ROOT:BEGIN 

    DECLARE pTotal,pShortCode,pSignUp,pUnSub,pJunk INT; 
    DECLARE pCOM NVARCHAR(10); 
    DECLARE no_more_rows BOOLEAN; 

    CREATE TEMPORARY TABLE TMOMain 
    (GrandTotal INT,ShortCode INT,COM NVARCHAR(10),SignUp INT,UnSub INT, Junk INT); 

    DECLARE MoMainCur CURSOR FOR 
    SELECT COUNT(*),shortcode,(CASE WHEN ComID= 1 THEN 'A' 
    WHEN ComID= 2 THEN 'B' WHEN ComID= 3 THEN 'C' ELSE 'UV' END) AS COM 
    FROM tbl_inbox 
    INNER JOIN tbl_keyword ON keywordid = recvkeyword 
    WHERE recvDate >='2011-11-15' AND recvDate < '2011-11-16' 
    GROUP BY shortcode,COM; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND 
    SET no_more_rows = TRUE;  

    OPEN MoMainCur; 

    read_loop:LOOP 
    FETCH MoMainCur INTO pTotal,pShortCode,pCOM ; 

    INSERT INTO TMOMain 
    VALUES 
    (pTotal,pShortcode,pCOM ,0,0,0); 
    IF no_more_rows THEN 
     CLOSE MoMainCur; 
     LEAVE the_loop; 

    END LOOP; 

    -- CLOSE MoMain; 

    SELECT * FROM TMOMain; 
    END$$ 
DELIMITER ; 

MySQL版本5.1

錯誤消息:

你有一個錯誤的SQL語法;檢查對應於你的MySQL服務器版本使用附近的正確語法手冊「聲明MoMainCur CURSOR FOR

回答

2

fine manual

DECLARE只允許一個BEGIN ... END複合語句和必須內在任何其他陳述之前,應該在其開始。

聲明必須遵循特定順序。遊標必須在聲明處理程序之前聲明。必須在聲明遊標或處理程序之前聲明變量和條件。

強調我的。

將您的CREATE TEMPORARY TABLE TMOMain移動到全部DECLARE s。

+0

謝謝!它解決了這個問題。第一次使用mysql,所以我沒有真正打擾回合的命令。謝謝! –