首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL8过程-在游标中使用参数

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

Stack Overflow用户
提问于 2020-04-27 09:52:13
回答 2查看 583关注 0票数 0

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

代码语言:javascript
复制
--                               -role-      -table-  -cond- 
CALL grantRoleToUsersFromWhere('Student', 'studenten', true);

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

这告诉我,参数'userTable‘没有写入变量'uTable’或'uTable‘,游标语句根本无法将其识别为变量。

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

我花了不少时间在这个问题上,但我想我错过了一个重要而简单的部分:-)

代码语言:javascript
复制
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 ;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-27 10:09:59

不可能直接创建动态游标。但是,您可以使用视图来实现相同的目标。见示例

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-04-27 10:11:55

“从cur1中为选择名称声明aCond游标是不可能的;”mysql不执行变量替换(用于表名)。read循环是无限的,因为您没有声明连续处理程序,并且没有在read循环中测试not。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61456084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档