首页 > 解决方案 > 在存储过程中使用参数获取动态表名

问题描述

我已经编写了一个非常复杂的存储过程,但现在我想使用变量为过程带来一些动态。当谈到 sql 编程时,我仍然称自己为新手,所以我可能完全走错了我想要实现的目标。我在 Windows 上运行最新的 MySQL 服务器 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`; 

...没有粘贴任何进一步的代码,因为我无法处理以下问题。

我试过......直接使用变量>变量在语句
中没有解析......不允许 定义变量之前 ...... 'ed字符串来构建一个语句并'ed它>在存储的部分不起作用程序DECLARE CURSOR
user-definedlocal-variables
CONCATEXECUTEDECLARE

在这一点上,我对如何处理这个问题的每一个提示或全新的想法完全开放。

感谢您的任何建议!

[更新]
我的方法有一些缺陷,我不理解临时表的基本概念,例如会话独有。感谢'D's Query'和更多阅读,我现在有了一个工作存储过程,而不必处理游标和临时表的动态名称。

标签: mysqlstored-procedures

解决方案


I dont know what actually you are focusing on but loading a dynamic tables can be possible with prepared statements in Stored Procedures but prepared statements won't work with CURSORS.

Example of Prepared statement is

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

推荐阅读