Oracle Merge Rejection Row Count

时间:2010-06-03 11:21:29

标签: oracle plsql oracle11g

鉴于具有拒绝限制的Oracle Merge语句,是否有一种简便的方法来识别被拒绝的行数,而不必强制查询拒绝目标?

拒绝目的地有合并前的记录,因此目前必须计算两次并采取差异,但似乎应该有一个暴露的计数器,因为它必须知道它是否已超过拒绝限制。

1 个答案:

答案 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;

    ....