创建存储过程时出现MySQL语法错误问题

时间:2017-02-06 12:24:08

标签: mysql stored-procedures

我试图创建存储过程,但phpmyadmin说我的语法错误,但我看不到任何错误。

1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在#CURSOR CUR_ID_FORUM附近使用正确的语法

时 选择ForumID FROM论坛'在第3行

delimiter //
CREATE PROCEDURE updateForumAdmin (IN user_id INT, IN previous_role INT,IN new_role INT)
BEGIN 
CURSOR CUR_ID_FORUM 
IS 
SELECT ForumID FROM Forum //
IF(
    previous_role=1,
    DELETE ForumManager WHERE ModuleID=3 AND ModuleEntityID=user_id AND IsDirect=0,
    SELECT ForumID FROM Forum
    FOR REC_ID_FORUM IN CUR_ID_FORUM
    LOOP
        INSERT ForumManager (ForumID,ModuleID,ModuleEntityID,ModuleRoleID,AddedBy,IsDirect) VALUES (REC_ID_FORUM,3,user_id,11,0,0)
    END LOOP //
)
END //
delimiter ;

我的更新代码:

delimiter //
CREATE PROCEDURE updateForumAdmin (IN user_id INT, IN previous_role INT,IN new_role INT)
BEGIN 
DECLARE REC_ID_FORUM INT(11) //
DECLARE CUR_ID_FORUM CURSOR FOR SELECT ForumID FROM Forum //
IF(
    previous_role=1,
    DELETE ForumManager WHERE ModuleID=3 AND ModuleEntityID=user_id AND IsDirect=0,
    SELECT ForumID FROM Forum
    FOR REC_ID_FORUM IN CUR_ID_FORUM
    LOOP
        FETCH CUR_ID_FORUM INTO REC_ID_FORUM //
        INSERT ForumManager (ForumID,ModuleID,ModuleEntityID,ModuleRoleID,AddedBy,IsDirect) VALUES (REC_ID_FORUM,3,user_id,11,0,0)
    END LOOP //
)
END //
delimiter ;

和phpmyadmin的更新错误:

1064 - 您的SQL语法出错;查看与您的MySQL服务器版本相对应的手册,以获得在''附近使用的正确语法。在第3行

1 个答案:

答案 0 :(得分:2)

更新: 您的语法在许多地方都不正确。您需要声明REC_ID_FORUM变量以用于光标提取:

DECLARE REC_ID_FORUM INTEGER //

您需要使用正确的游标语法:

DECLARE CUR_ID_FORUM CURSOR FOR SELECT ForumID FROM Forum //

声明光标后,需要打开它:

OPEN CUR_ID_FORUM //

在你的if语句中,你需要从LOOP中的光标进行FETCH:

FETCH CUR_ID_FORUM INTO REC_ID_FORUM //

您的IF语句语法也错误。您正在使用MySQL select语句中使用的IF函数,而不是存储过程中使用的IF条件。

以下是我认为您的整个代码应该是这样的:

delimiter //
CREATE PROCEDURE updateForumAdmin (IN user_id INT, IN previous_role INT,IN new_role INT)
BEGIN 
    DECLARE REC_ID_FORUM INTEGER //
    DECLARE CUR_ID_FORUM CURSOR FOR SELECT ForumID FROM Forum //
    IF previous_role = 1 THEN
        DELETE ForumManager WHERE ModuleID=3 AND ModuleEntityID=user_id AND IsDirect=0 //
    ELSE
        OPEN CUR_ID_FORUM //
        LOOP
            FETCH CUR_ID_FORUM INTO REC_ID_FORUM //
            INSERT ForumManager (ForumID,ModuleID,ModuleEntityID,ModuleRoleID,AddedBy,IsDirect) VALUES (REC_ID_FORUM,3,user_id,11,0,0)
        END LOOP //
    END IF //
END //
delimiter ;

这是非常未经测试的,但应该让你更接近。