mysql - 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 ;
解决方案
' DECLARE cur1 CURSOR FOR SELECT Name FROM uTable WHERE aCond;' 不可能 mysql 不进行变量替换(用于表名)。您的读取循环是无限的,因为您没有声明继续处理程序并测试未在读取循环中找到。
推荐阅读
- batch-file - 如何记录任务列表的计数
- vertica - 如何使重复的vertica中现有的表列值唯一?
- android - 我的 videoview 说“无法播放视频”,但 webview 可以播放吗?
- asp.net-mvc - 等待的呼叫在单元测试中丢失上下文
- javascript - 用户交互超级事件
- javascript - js如何破坏函数的默认值?
- python - 制作成对的文件和列以在循环中使用?
- selenium - 无法通过 selenium 获取 ul 标签下的所有 li 项
- arrays - 解析数组时如何简化 if..else 语句
- glsl - 如何使用6个sampler2D实现textureCube