首页 > 解决方案 > MySQL8 过程 - 在光标中使用参数

问题描述

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

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

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

这告诉我参数“userTable”未写入变量“uTable”或“uTable”根本不被游标语句识别为变量。

我尝试了存储/使用参数的不同方法。例如,直接使用它们或将它们存储在带有 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 ;

标签: mysqlstored-procedurescursorparameter-passingmysql-8.0

解决方案


' DECLARE cur1 CURSOR FOR SELECT Name FROM uTable WHERE aCond;' 不可能 mysql 不进行变量替换(用于表名)。您的读取循环是无限的,因为您没有声明继续处理程序并测试未在读取循环中找到。


推荐阅读