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