我有 2 个表:一个带有原始数据的临时表。其中的行可能会重复(超过 1 次)。第二个是具有实际数据的目标表(每一行都是唯一的)。
我正在使用游标传输行。在游标内,我使用 MERGE 语句。如何使用 DBMS_OUTPUT.PUT_LINE 打印到控制台,哪些行被更新,哪些被删除?
根据官方文档,此声明没有此类功能。
有什么解决方法吗?
以前的海报已经说过这种方法是可疑的,因为光标/循环和输出日志供审查。
在 SQL Server 上,MERGE 语句中有一个 OUTPUT 子句,它允许您在另一个表中插入一行,并执行 $ 操作(插入、更新、删除)以及您想要的插入或删除/覆盖数据中的任何列。这可以让您完全按照您的要求进行总结。
等效的 Oracle RETURNING 子句可能不适用于 MERGE,但适用于 UPDATE 和 DELETE。
我不明白你为什么要这样做。的输出dbms_output
需要有人在那里查看。不仅需要有人查看所有输出,否则毫无意义。如果有超过 20 行,那么没有人会费心这样做。如果没有人查看所有输出以进行验证,但您需要实际记录它,那么您这样做是在积极伤害自己。
如果你真的需要记录哪些行被更新或删除,有几个选项;两者都涉及性能命中。
您可以切换到BULK COLLECT,它使您能够使用临时表的 ROWID 创建游标。您将两个表的 JOIN 批量收集到此中。根据 rowid 并根据您的业务逻辑从目标表中更新/删除,然后使用某种标志更新临时表以指示执行的操作。
您在目标表上创建一个触发器,该触发器记录另一个表发生的情况。
实际上,除非知道更新/删除的数量很重要,否则您不应该做任何事情。创建您的 MERGE 语句,以确保在出现任何问题时出错,并使用错误日志记录子句记录您收到的任何错误。这些更有可能是您应该注意的事情。