MySQL / MariaDB疑难解答存储过程语法错误

时间:2017-01-01 15:02:23

标签: mysql database stored-procedures mariadb

我正在尝试编写以下存储过程,但我不断收到语法错误,我已将其包含在SP下。

DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `test`(categoryID int, userID int)
BEGIN
    DECLARE vbUserId INT DEFAULT ( SELECT userfield.field6 FROM userfield WHERE userfield.field6 = userID );
    DECLARE m_forumId, m_numOfPosts, m_numOfThreads, m_hasChildren, m_isPrivate INT;
    DECLARE m_forumName VARCHAR(100);
    DECLARE lastRow INT DEFAULT 0;

    CREATE TEMPORARY TABLE tmp engine=memory AS (select forumid,replace(replace(title_clean,'&','&'),'"','') as forumName,replycount as NumOfPosts, threadcount as NumOfThreads, 0 as hasChildren, showprivate as isprivate from forum where parentid=categoryID and displayorder!=0 and options&1=1 order by displayorder);

    DECLARE cur_forums CURSOR FOR select * from tmp;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET lastRow = 1;
    OPEN cur_forums;
    iterate_forums: LOOP
        FETCH cur_forums INTO m_forumId, m_forumName, m_numOfPosts, m_numOfThreads, m_hasChildren, m_isPrivate;             
        IF lastRow = 1 THEN LEAVE iterate_forums;
        IF (m_isPrivate = 1)
            SELECT CONCAT('Private: ', m_isPrivate);
        END IF
    END LOOP iterate_forums;
    CLOSE cur_forums;
    DROP TEMPORARY TABLE IF EXISTS tmp;

END$$

以下是我尝试将其导入db时收到的错误:

ERROR 1064 (42000) at line 2: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DECLARE cur_forums CURSOR FOR select * from tmp;
        DECLARE CONTINUE HANDLER FOR N' at line 10

我已阅读文档并查看以前的SO问题,并尝试评论某些行或自行运行,但仍然无法弄清楚我做错了什么。

3 个答案:

答案 0 :(得分:1)

更改顺序如下:1声明,然后打开

....
    DECLARE vbUserId INT DEFAULT ( SELECT userfield.field6 FROM userfield WHERE userfield.field6 = userID );
    DECLARE m_forumId, m_numOfPosts, m_numOfThreads, m_hasChildren, m_isPrivate INT;
    DECLARE m_forumName VARCHAR(100);
    DECLARE lastRow INT DEFAULT 0;
    DECLARE  cur_forums CURSOR FOR select * from tmp;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET lastRow = 1;

    OPEN cur_forums;

    CREATE TEMPORARY TABLE tmp engine=memory AS (select forumid,replace(replace(title_clean,'&','&'),'"','') as .....
...

答案 1 :(得分:1)

查克fsharp.core 4.0.0.1tmp。相反,只需

cursor

select "Private: 1" FROM forum WHERE EXISTS ( SELECT * from forum where parentid=categoryID and displayorder!=0 and options&1=1 AND showprivate = 1 ); 似乎未被使用;摆脱它。

答案 2 :(得分:0)

通过重写来修复它:

DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `test`(categoryID int, userID int)
BEGIN
        DECLARE vbUserId INT DEFAULT (
               SELECT userfield.field6 FROM userfield
                   WHERE userfield.field6 = userID );
        DECLARE m_forumId, m_numOfPosts, m_numOfThreads,
                m_hasChildren, m_isPrivate INT;
        DECLARE m_forumName VARCHAR(100);
        DECLARE lastRow INT DEFAULT FALSE;

        DECLARE curForums CURSOR FOR select * from tmp;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET lastRow = TRUE;

        CREATE TEMPORARY TABLE tmp engine=memory AS (
            select forumid,
                   replace(replace(title_clean,'&','&'),'"','')
                             as forumName,
                   replycount as NumOfPosts,
                   threadcount as NumOfThreads,
                   0 as hasChildren,
                   showprivate as isprivate
               from forum
               where parentid=categoryID
                 and displayorder!=0
                 and options&1=1
               order by displayorder);

        OPEN curForums;
        iterateForums: LOOP
                FETCH curForums INTO m_forumId, m_forumName,
                                     m_numOfPosts, m_numOfThreads,
                                     m_hasChildren, m_isPrivate;
                IF lastRow THEN 
                    LEAVE iterateForums;
                END IF;
                IF m_isPrivate = 1 THEN 
                    SELECT (m_isPrivate);
                END IF;                 
        END LOOP;
        CLOSE curForums;

        DROP TEMPORARY TABLE IF EXISTS tmp;

END$$
DELIMITER ;