MySQL8 程序 - 在游标中使用参数
MySQL8 Procedure - Use Parameters in Cursor
我正在尝试在过程的游标内使用存储过程的输入参数。
按如下方式调用过程会导致错误
-- -role- -table- -cond-
CALL grantRoleToUsersFromWhere('Student', 'studenten', true);
Error Code: 1146. Table 'uni4.utable' doesn't exist
这告诉我参数 '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 ;
无法直接创建动态游标。但是,您可以使用 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//
' DECLARE cur1 CURSOR FOR SELECT Name FROM uTable WHERE aCond;'不可能 mysql 不进行变量替换(对于 table 名称)。您的读取循环是无限的,因为您没有声明继续处理程序并测试在读取循环中找不到。
我正在尝试在过程的游标内使用存储过程的输入参数。 按如下方式调用过程会导致错误
-- -role- -table- -cond-
CALL grantRoleToUsersFromWhere('Student', 'studenten', true);
Error Code: 1146. Table 'uni4.utable' doesn't exist
这告诉我参数 '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 ;
无法直接创建动态游标。但是,您可以使用 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//
' DECLARE cur1 CURSOR FOR SELECT Name FROM uTable WHERE aCond;'不可能 mysql 不进行变量替换(对于 table 名称)。您的读取循环是无限的,因为您没有声明继续处理程序并测试在读取循环中找不到。