我已经编写了一个相当复杂的存储过程,但现在我想使用变量在过程中引入一些动态性。当涉及到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`; ..。我没有粘贴任何进一步的代码,因为我无法处理以下问题。
我试过了
..。在DECLARE CURSOR语句中未解析直接使用变量>变量
..。不允许在local-variables之前定义user-defined变量
对字符串执行CONCAT操作以构建语句,并对其执行EXECUTE操作,但在存储过程的DECLARE部分不起作用.
在这一点上,我完全对如何处理这一点的每一个提示或全新的想法持开放态度。
谢谢你的建议!
更新
我的方法有一些缺陷,我不理解临时表的基本概念,例如,对于会话是唯一的。多亏了“D的查询”和更多的阅读,我现在有了一个可以工作的存储过程,而不必处理游标和临时表的动态名称。
发布于 2018-12-17 01:58:18
我不知道您实际上关注的是什么,但是可以使用存储过程中的预准备语句加载动态表,但是预准备语句不能用于游标。
预准备语句的示例如下
SET $sql=CONCAT('SELECT * from ', var_tablename);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;https://stackoverflow.com/questions/53804607
复制相似问题