mysql - 在存储过程中使用参数获取动态表名
问题描述
我已经编写了一个非常复杂的存储过程,但现在我想使用变量为过程带来一些动态。当谈到 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-defined
local-variables
CONCAT
EXECUTE
DECLARE
在这一点上,我对如何处理这个问题的每一个提示或全新的想法完全开放。
感谢您的任何建议!
[更新]
我的方法有一些缺陷,我不理解临时表的基本概念,例如会话独有。感谢'D's Query'和更多阅读,我现在有了一个工作存储过程,而不必处理游标和临时表的动态名称。
解决方案
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;
推荐阅读
- javascript - 如何创建交换具有不同 id 的 div 的函数?
- javascript - 在接口上定义索引类型的选择
- node.js - 从目录加载 d3.js 和 c3.js 不起作用
- kotlin - Kotlin 如何在 kotlin 中使用 java 流 .map() 来映射不同的对象响应
- powerbi - 在连字符的左右添加前导零
- c# - Xamarin 表单中的 Hijri DatePicker(特别是 IOS)
- sql - 如何计算 SQL 中不同表中的员工人数?
- java - 如何将背景颜色更改为 RecycleView 中的特定查看器项目?
- nginx - 安装 SSL 证书后,所有“设计”操作都出现“您想要的更改被拒绝”错误
- node.js - 有没有办法在 503 错误后自动重启 nodejs 应用程序?