2010-06-03 108 views
2

如果Oracle Merge語句具有拒絕限制,是否有一種簡略的方法來確定有多少行被拒絕,而不必強制查詢拒絕目標?Oracle合併排斥行數

拒絕目的地有記錄預合併,所以目前必須計算兩次,並採取差異,但它似乎應該有一個櫃檯暴露,因爲它必須知道它是否已超過拒絕限制。

回答

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; 

    .... 
+0

它沒有被用作永久錯誤日誌,導入是自動化的並且相對頻繁,所以以前的錯誤不能保證在後續導入時被解決。看起來我被迫重複計算表格。 – Andrew 2010-06-14 09:02:17