【问题标题】:Using parameter in stored procedure to get dynamic table name在存储过程中使用参数获取动态表名
【发布时间】:2018-12-16 17:14:13
【问题描述】:

我已经编写了一个非常复杂的存储过程,但现在我想使用变量为过程带来一些动态。在 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'ed 字符串以构建语句,EXECUTE'ed 它 > 在存储过程的 DECLAREpart 中不起作用

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

感谢您的建议!

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

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

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

    Prepared 语句的示例是

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

    【讨论】:

    • 基于参数命名临时表然后必须使用动态临时表名称创建游标的原因只是为了防止同时有2个相同的临时表。我猜如果 2 个用户碰巧同时调用这个函数,这可能会以错误结束,对吧?
    • 临时表不是所有用户都可以访问的单个表。临时表是特定于会话的。如果两个用户尝试同时访问一个存储过程或函数,那么他们将拥有不同的临时表副本。我建议您了解临时表的基本概念。
    • 感谢您解释这一事实。我确实没有深入了解临时表的文档,现在将在那里多花一些时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2011-06-11
    • 2014-07-07
    相关资源
    最近更新 更多