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

问题描述 投票:0回答:2

我正在尝试在过程的游标内使用存储过程的输入参数。如下调用该过程将导致错误

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

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

这告诉我参数'userTable'没有写到变量'uTable'或'uTable'根本没有被游标Statement识别为变量。

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

我花了很多时间,但是我想我缺少了一个重要而简单的部分:-)

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 ;

mysql stored-procedures cursor parameter-passing mysql-8.0
2个回答
0
投票

无法直接创建动态游标。但是,您可以使用VIEW来实现相同的目的。参见sample

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//

0
投票

'在uTable的条件中选择名称的DECLARE cur1游标;' mysql不可能不进行变量替换(用于表名)。您的读取循环是无限的,因为您没有声明继续处理程序并且测试在读取循环中没有找到。

© www.soinside.com 2019 - 2024. All rights reserved.