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

标签 mysql stored-procedures

我正在尝试创建存储过程,但 phpmyadmin 说我在其中有语法错误,但我看不到任何错误。

1064 - 您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 'CURSOR CUR_ID_FORUM

附近使用的正确语法

是 SELECT ForumID FROM Forum' 在第 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 行的 '' 附近使用的正确语法

最佳答案

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

DECLARE REC_ID_FORUM INTEGER //

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

DECLARE CUR_ID_FORUM CURSOR FOR SELECT ForumID FROM Forum //

声明游标后,您需要打开它:

OPEN CUR_ID_FORUM //

并且在您的 if 语句中,您需要从循环中的游标中获取:

FETCH CUR_ID_FORUM INTO REC_ID_FORUM //

您的 IF 语句语法也是错误的。您使用的是 MySQL 选择语句中使用的 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 ;

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

关于MySQL创建存储过程语法错误问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42067736/

相关文章:

mysql程序: syntax,语法,语法……太难找了

c# - 选择多条记录的存储过程

sql - 为什么此存储过程适用于一个查询而不适用于另一查询?

php - 使用复选框更新数据库列

mysql - 如何在mongodb和mysql中搜索搜索到的子字符串中的某个字符串?

php - 在重复键的数据库更新中插入 API 结果

mysql - 在MySql存储函数中生成随机字符串

mysql - 数据管理网关连接MySQL

mysql - 如何在 MySql 中将字符串 "lat, lon"转换为 POINT

sql-server - IsNumeric 在 SQL Server 中不起作用