MySQL8过程-在游标中使用参数



我试图在过程的游标中使用存储过程的输入参数。按以下方式调用过程会导致错误

--                               -role-      -table-  -cond- 
CALL grantRoleToUsersFromWhere('Student', 'studenten', true);

错误代码:1146。表"uni4.utable"不存在

此错误告诉我参数"userTable"未写入变量"uTable",或者游标语句根本无法将"uTable"识别为变量。

我尝试了不同的方法来存储/使用参数。例如,直接使用它们或将它们存储在带有SET语句的变量中。但是,如果我尝试使用SET uTable=userTable;在游标声明之前,MySQL WorkBench不会接受Procedure声明。

我花了很多时间在这上面,但我想我错过了一个重要但简单的部分:-(

DROP PROCEDURE IF EXISTS grantRoleToUsersFromWhere;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE grantRoleToUsersFromWhere(IN grantRole VARCHAR(30), IN userTable VARCHAR(30), IN addCondition VARCHAR(50))
BEGIN
DECLARE workUser VARCHAR(30) default '';    
DECLARE gRole VARCHAR(30) default grantRole;
DECLARE uTable VARCHAR(30) default userTable;
DECLARE aCond VARCHAR(50) default addCondition;
DECLARE cur1 CURSOR FOR SELECT Name FROM uTable WHERE aCond;
OPEN cur1;    
read_loop: LOOP
FETCH cur1 INTO workUser;
GRANT gRole TO workUser;
END LOOP;    
CLOSE cur1; 
END $$
DELIMITER ;

不能直接创建动态游标。然而,您可以使用VIEW来实现同样的功能。请参见示例。

CREATE PROCEDURE p1 (select_statement VARCHAR(255))
BEGIN
DECLARE v1,v2 VARCHAR(255);
DECLARE c CURSOR FOR SELECT * FROM t;
SET @v = CONCAT('create temporary table t as ',select_statement);
PREPARE stmt1 FROM @v;
EXECUTE stmt1;
OPEN c;
FETCH c INTO v1,v2;
SELECT v1,v2;
END//

'声明cur1 CURSOR用于从uTable WHERE aCond;'选择名称不可能mysql不做变量替换(用于表名(。您的读取循环是无限的,因为您没有声明延续处理程序,也没有测试在读取循环中找不到。

最新更新