鉴于具有拒绝限制的Oracle Merge语句,是否有一种简便的方法来识别被拒绝的行数,而不必强制查询拒绝目标?
拒绝目的地有合并前的记录,因此目前必须计算两次并采取差异,但似乎应该有一个暴露的计数器,因为它必须知道它是否已超过拒绝限制。
答案 0 :(得分:2)
没有暴露的拒绝计数器。
DML错误记录的主要目的是支持ETL过程。它允许我们加载大量数据而不会产生一些错误,从而迫使整个负载回滚。我想基本原理是在我们针对该表发出更多DML之前手动解决错误:它并不是真正意图提供永久错误日志。
但是,如果您为每个DML语句指定一个唯一标记,则可以计算它产生的确切拒绝次数。
declare
l_tag varchar2(46);
reject_cnt pls_integer;
begin
....
l_tag := 'merging from source_table::'||to_char(sysdate, 'yyyymmddhh24miss');
merge into target_table a
using source_table b
on (a.id = b.id)
....
log errors into err$_target_table (l_tag) reject limit 10;
select count(*)
into reject_cnt
from err$_target_table
where ora_err_tag$ = l_tag;
....