我正在尝试创建存储过程,但 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/