Oracle PLSQL 合并临时表中的记录
Posted
技术标签:
【中文标题】Oracle PLSQL 合并临时表中的记录【英文标题】:Oracle PLSQL merge records within temporary table 【发布时间】:2013-04-20 07:09:23 【问题描述】:我在 PLSQL 中有一个填满临时表的过程。数据如下所示:
BUYER_NAME QUANTITY AMOUNT
-------------------------------
JOHN 10 1200
JOHN 12 1310
ALAN 15 1450
ALAN 10 1200
JOHN 20 2400
我需要总结每个买家的数量和金额,然后删除现有数据并再次填写表格,以便每个买家名称仅出现一次总数量和金额。
我知道如果我创建另一个临时表并通过它传输数据,就可以做到这一点。但是,有没有一种方法可以合并同一个临时表中的记录(以及同一个会话中)?
【问题讨论】:
MERGE
声明呢? docs.oracle.com/cd/B28359_01/server.111/b28286/…
@a_horse_with_no_name 我想知道合并语句在这种情况下如何工作,因为数据源是同一个表。
这不是一个好的操作方式。为了做好工作,我建议您使用该过程填充一个全局临时表,然后将分组数据合并到一个最终表中,其中 BUYER_NAME 是一个唯一列。
【参考方案1】:
听起来这里的问题在于填充表的 initil pl/sql 过程。为什么不修改它来做到这一点呢?我怀疑答案是它大量使用了 pl/sql——如果是这样,请尽一切努力将其转换为 SQL,或者将其转换为流水线函数,您可以从中选择并汇总其输出。
除此之外,我只是将结果汇总到另一个表中。我假设这些是全局临时表,因此这样做实际上并没有太多开销,因为直接插入到 GTT 的路径将比修改已经存在的表更有效。
【讨论】:
我同意汇总和“不同”操作很可能可以在单个查询中完成。也许那甚至不需要临时表(流水线函数可能就足够了)。 其实在最初的PLSQL中数据是不能聚合的。处理数据(计算值),然后插入临时表。我可以在同一个会话中创建同一个临时表的两个实例并在它们之间进行数据传输吗? @asim-ishaq:我很确定您可以在同一个语句中聚合数据。为什么不向我们展示填充临时表的语句? 先看看使用流水线函数——如果你不需要详细的结果,就不要写了。在回答您的问题时,最好将临时表定义为“全局临时表”,因为它们不受太多日志记录的影响(特别是不需要重做,因为数据永远不需要恢复)并且它们是“自清空的”。您将它们定义为模式的永久部分,而不是在处理期间。如果你真的需要两个,那么创建两个单独的。以上是关于Oracle PLSQL 合并临时表中的记录的主要内容,如果未能解决你的问题,请参考以下文章