mysql—在存储过程中使用参数获取动态表名

vmdwslir  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(496)

我已经编写了一个相当复杂的存储过程,但是现在我想在使用变量的过程中引入一些动态性。当谈到sql编程时,我仍然称自己是一个新手,所以我可能完全走错了我想要实现的目标。我正在windows上运行最新的mysql server 8.0.13(仅适用于本地开发人员)。
我目前对存储过程的想法
... 使用输入变量
... 声明一个游标(使用var)
... 创建临时表(使用var)
... 遍历临时表
... 将数据写入新表
我想我了解一些基本的工具来做到这一点,但我失败了一次又一次地处理变量下面的代码显示了项目的顶部部分,我已经失败了。

PROCEDURE sprProcedure (
  IN vInputParameter varchar(64)
 )
 BEGIN
  DECLARE vFinished INTEGER DEFAULT 0;

  -- declare cursor
  DECLARE cCursor CURSOR FOR SELECT * FROM tbltmp_(vInputParameter);
  DECLARE CONTINUE HANDLER 
    FOR NOT FOUND SET vFinished = 1;

  -- drop / create temp table
  DROP TABLE IF EXISTS (vInputParameter);
  CREATE TEMPORARY TABLE tbltmp_(vInputParameter)
   SELECT * FROM `tbl_DataSource`;

... 没有粘贴任何进一步的代码,因为我不能处理以下问题。
我试过了
... 直接使用变量>变量不会在中解析 DECLARE CURSOR 陈述
... 定义 user-defined 前变量 local-variables 不允许
... CONCAT '编辑字符串以生成语句 EXECUTE “ed it>不适用于 DECLARE 存储过程的一部分
在这一点上,我完全开放的每一个提示或完全新的想法如何处理这一点。
谢谢你的建议!
[更新]
我的方法有一些缺陷,我不理解temp表的基本概念,例如对于会话来说是唯一的。多亏了'd's query'和更多的阅读,我现在有了一个工作的存储过程,而不必处理游标和临时表的动态名称。

dgjrabp2

dgjrabp21#

我不知道您实际上关注的是什么,但是加载动态表可以使用存储过程中的prepared语句,但是prepared语句不能使用游标。
准备好的语句的例子是

SET $sql=CONCAT('SELECT * from ', var_tablename);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

相关问题