1

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

我正在使用游标传输行。在游标内,我使用 MERGE 语句。如何使用 DBMS_OUTPUT.PUT_LINE 打印到控制台,哪些行被更新,哪些被删除?

根据官方文档,此声明没有此类功能。

有什么解决方法吗?

4

2 回答 2

1

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

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

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

于 2013-04-02T19:03:41.727 回答
1

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

如果你真的需要记录哪些行被更新或删除,有几个选项;两者都涉及性能命中。

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

  2. 您在目标表上创建一个触发器,该触发器记录另一个表发生的情况。

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

于 2013-01-18T09:08:12.797 回答