创建表时绑定变量?
Posted
技术标签:
【中文标题】创建表时绑定变量?【英文标题】:Bind Variable When Creating Table? 【发布时间】:2015-10-26 17:46:44 【问题描述】:我正在尝试创建一个按可变日期过滤的表格,具体取决于当前日期。虽然我对 Oracle 和 PL/SQL 还很陌生,但我已经成功编写了一些“高级初学者”PL/SQL 过程。但我想知道我是否采用了正确的方法使用变量来实现我的目标。我想做的简化版:
将表 myTable 创建为 从 oldTable 中选择 * 有效日期是 > 可变日期
也许在查询本身中使用 case 语句而不是使用 case 语句创建变量然后在查询中使用该变量会更好地实现这一点。但我认为变量会更精简、更易于阅读,并且可能运行得更快。
我用谷歌搜索过,但我发现的大部分内容都试图告诉我如何写它,而不是我的方法是否最有效。
非常感谢任何想法/建议!
【问题讨论】:
您需要学习使用流水线函数的更复杂的解决方案。您可以在运行时使用立即执行创建表,但不可能有一个基于变量更新自身的表。为什么不直接使用变量创建游标并填充全局临时表? 在运行时创建表无论如何都是不寻常的。是否保存临时数据-在这种情况下,全局临时表或集合可能更合适?另一个想法是,如果变量以可预测的方式“取决于当前日期”,例如trunc(sysdate) -5
,您可能有一个包含该过滤器的视图。不过,这取决于您的最终目标是什么,以及您计划在哪里/如何使用新桌子。 (如果它不太可预测,您可以使用上下文来参数化视图,但这又取决于您在做什么......)
感谢您的快速回复。答案让我有点不知所措,尽管它们给了我一些研究和学习的东西。我以前没有使用过游标,所以我将对此进行调查。为了更具描述性,这确实是一个临时表,并且可变日期非常具有预测性。从本质上讲,我正在编写一份工作,该工作将始终在特定年份结束时用于处理来年第一年之后的活动数据。不过,这也有可能在 1 月份再次运行以收集落后者。
那么在您运行它时存在的数据是否需要保留,超出作业/会话的生命周期?我也认为没有人能够评估您的方法的效率 - 不确定它与真正的比较。
不需要保存。对我来说,问题是我将针对我将加入的几个永久表运行此作业,每个表包含数千万条记录,而我的前辈确实/没有非常有效地编写 - 作业在精简之前已经运行了几个小时在 40 分钟内运行,等等——所以没有什么可以效仿的。您对这太模糊的评估可能是正确的。但是你给了我一些思考的东西,这正是我想要的。谢谢!
【参考方案1】:
尝试在您的过程中使用动态 SQL。
CREATE PROCEDURE proc_name (variabledate DATE) IS
v_sql_stmt VARCHAR2(1000);
BEGIN
v_sql_stmt = 'Create Table myTable as Select * from oldTable where effective_date is > :bind_variabledate';
EXECUTE IMMEDIATE v_sql_stmt USING variabledate;
END;
PS。不建议使用动态SQL,因为它容易发生SQL注入并且不容易调试,你真的需要知道你在使用它的时候是什么。话虽如此,它是在运行时处理数据时使用的强大功能。
【讨论】:
是的,我就是这么写的 :-) 我只是不确定这是最有效的方法,并且正在寻找一种快速而肮脏的方法来找出那些更有经验的人会做什么:-) 谢谢!以上是关于创建表时绑定变量?的主要内容,如果未能解决你的问题,请参考以下文章