2017-01-01 13 views
0

次のストアドプロシージャを作成しようとしていますが、私はSPに含まれている構文エラーが発生し続けます。ここでストアドプロシージャ構文のエラーをトラブルシューティングするMySQL/MariaDB

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の質問の上に見て、また、特定の行をコメントアウトしてみました自分で実行していても、私が間違っていることはまだ分かりません。

答えて

1

チャックtmpcursor。代わりに、単に

select "Private: 1" 
    FROM forum 
    WHERE EXISTS (SELECT * 
      from forum 
      where parentid=categoryID 
      and displayorder!=0 
      and options&1=1 
      AND showprivate = 1); 

vbUserIdは未使用のようです。それを取り除く。

+0

これは、コードのこの未完成の部分には使用されていません。 :)私はあなたの答えが実際には収まらないので、全部を投稿しておくべきだった。しかし、私はしなかったので、ポイントを持っています。 – blizz

1

状の変化の順序を:それから1つのDECLARE、ように再度書き込むことによってそれを修正

.... 
    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 ..... 
... 
+0

テーブルをまだ作成していない場合は、カーソルを宣言するときに "tmp"テーブルから選択する方法はありますか? – blizz

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 ; 
関連する問題