我试图创建存储过程,但phpmyadmin说我的语法错误,但我看不到任何错误。
时 选择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行
答案 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 ;
这是非常未经测试的,但应该让你更接近。