Синтаксическая ошибка при использовании курсора в хранимых процедурах - PullRequest
1 голос
/ 19 ноября 2011

Я искал ответ на всем сайте, но ни один из них не решил мою проблему, поэтому я собираюсь опубликовать свою ошибку в новой теме.

Мой код,

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 ;

Версия для MYSQL5.1

Сообщение об ошибке:

В синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'DECLARE MoMainCur CURSOR FOR

1 Ответ

2 голосов
/ 19 ноября 2011

Из тонкого руководства :

DECLARE разрешено только внутри составного оператора BEGIN ... END, а должно быть в его начале перед любыми другими инструкциями.

Объявления должны следовать определенному порядку.Курсоры должны быть объявлены до объявления обработчиков.Переменные и условия должны быть объявлены до объявления курсоров или обработчиков.

Выделение мое.

Переместите CREATE TEMPORARY TABLE TMOMain на после всех ваших DECLARE с.

...