【问题标题】:Logging the results of a MERGE statement记录 MERGE 语句的结果
【发布时间】:2013-01-18 08:51:32
【问题描述】:

我有 2 个表:一个包含原始数据的临时表。其中的行可能会重复(超过 1 次)。第二个是包含实际数据的目标表(每一行都是唯一的)。

我正在使用游标传输行。在游标内,我使用 MERGE 语句。如何使用 DBMS_OUTPUT.PUT_LINE 将哪些行更新和哪些行删除?

根据official documentation,此语句没有这样的功能。

有什么解决办法吗?

【问题讨论】:

  • 在光标内使用合并至少听起来很可疑。这听起来非常低效。不,您不会从 MERGE 语句中得到任何反馈,它更新/插入/删除了什么。

标签: sql oracle oracle11g sql-merge


【解决方案1】:

我不明白你为什么要这样做。 dbms_output 的输出需要有人在场才能查看。不仅它需要有人查看所有的输出,否则它是没有意义的。如果有超过 20 行,那么没有人会费心这样做。如果没有人查看所有输出以进行验证,但您需要实际记录它,那么您这样做是在积极伤害自己。

如果您确实需要记录哪些行被更新或删除,有几个选项;不过,两者都涉及性能损失。

  1. 您可以切换到BULK COLLECT,这样您就可以使用临时表的 ROWID 创建游标。您将两个表的 JOIN 批量收集到此中。根据 rowid 并根据您的业务逻辑从目标表中更新/删除,然后使用某种标志更新临时表以指示执行的操作。

  2. 您在目标表上创建了一个trigger,用于记录另一个表发生的情况。

实际上,除非知道更新/删除的数量很重要,否则您不应该做任何事情。创建您的 MERGE 语句,以确保在出现任何问题时出错,并使用错误日志记录子句记录您收到的任何错误。这些更有可能是您应该注意的事情。

【讨论】:

    【解决方案2】:

    之前的发帖人已经说过这种方法是可疑的,因为光标/循环和输出日志供审查。

    在 SQL Server 上,MERGE 语句中有一个 OUTPUT 子句,它允许您在另一个表中插入一行,并执行 $action(插入、更新、删除)以及您插入或删除/覆盖的数据中的任何列想。这可以让您完全按照您的要求进行总结。

    等效的 Oracle RETURNING 子句可能不适用于 MERGE,但适用于 UPDATE 和 DELETE。

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多