代码之家  ›  专栏  ›  技术社区  ›  Andrew

Oracle合并拒绝行计数

  •  2
  • Andrew  · 技术社区  · 15 年前

    给定一个具有拒绝限制的Oracle合并语句,是否有一个简短的方法来标识被拒绝的行数,而不必强制查询拒绝目标?

    拒绝目的地有预先合并的记录,因此当前必须对其进行两次计数并计算差异,但考虑到必须知道是否已超过拒绝限制,似乎应该有一个计数器暴露。

    1 回复  |  直到 15 年前
        1
  •  2
  •   APC    15 年前

    没有暴露的拒绝计数器。

    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;
    
        ....