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

时间:2018-12-16 17:14:13

标签: mysql stored-procedures

我已经编写了一个非常复杂的存储过程,但是现在我想使用变量为过程带来一些动态。我仍然称自己为SQL编程的新手,所以我可能会完全错误地实现自己想要的目标。 我正在Windows上运行最新的MySQL服务器8.0.13(仅适用于本地开发人员)。

我对存储过程的当前想法
...使用输入变量
...声明一个游标(使用var)
...创建一个临时表(使用var)
...遍历临时表
...将数据写入新表

我认为我了解一些实现此目的的基本工具,但是在处理变量时一次又一次失败 以下代码显示了我已经失败的项目的顶部。

a[1]

...由于我无法处理以下问题,因此未粘贴任何其他代码。

我尝试了
...直接使用变量> 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部分中不起作用

在这一点上,我完全愿意接受有关如何解决此问题的任何提示或全新想法。

谢谢您的建议!

[更新]
我在那里的方法存在一些缺陷,而且我不了解临时表的基本概念,例如对于会话来说是唯一的。多亏了“ D's Query”和更多的阅读知识,我现在有了一个有效的存储过程,而不必处理游标和临时表的动态名称。

1 个答案:

答案 0 :(得分:0)

我不知道您实际上在关注什么,但是使用存储过程中的准备好的语句可以加载动态表,但是准备好的语句不适用于CURSORS。

Prepared语句的示例是

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