我已经编写了一个非常复杂的存储过程,但是现在我想使用变量为过程带来一些动态。我仍然称自己为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”和更多的阅读知识,我现在有了一个有效的存储过程,而不必处理游标和临时表的动态名称。
答案 0 :(得分:0)
我不知道您实际上在关注什么,但是使用存储过程中的准备好的语句可以加载动态表,但是准备好的语句不适用于CURSORS。
Prepared语句的示例是
SET $sql=CONCAT('SELECT * from ', var_tablename);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;