为什么DMML错误日志记录在并行语句中被忽略

时间:2019-03-28 13:49:42

标签: oracle error-handling parallel-processing

我有insert-select条语句正在并行执行。

我正在尝试添加一个dml error logging来捕获异常。

但是当我更改会话以使用并行时,错误日志记录就被忽略了。

-- This is my error table:
TRUNCATE TABLE DWH.ERR$_DWH_CONV;

-- This code is finish with no error and insert rows to DWH.ERR$_DWH_CONV
BEGIN
EXECUTE IMMEDIATE
'alter session enable parallel dml';

INSERT
        /*+ monitor parallel(1) */
INTO    DWH.PURCHASE
select *
FROM    DWH.PURCHASE_C LOG ERRORS
INTO    DWH.ERR$_DWH_CONV ('DWH.PURCHASE') REJECT LIMIT UNLIMITED ;

commit;
END;

但是,当我运行此代码(并行6)时-有一个异常(ORA-12801) 而且错误表没有任何变化:

BEGIN
EXECUTE IMMEDIATE
'alter session enable parallel dml';
INSERT
        /*+ monitor parallel(6) */
INTO    DWH.PURCHASE
select *
FROM    DWH.PURCHASE_C LOG ERRORS
INTO    DWH.ERR$_DWH_CONV ('DWH.PURCHASE') REJECT LIMIT UNLIMITED ;
commit;
END;

如果我启用或禁用alter-session,也会出现这种差异。

我正在使用Oracle 11g。

根据Oracle文档,我没有看到将dml error loggingparallel一起使用的任何限制。

1 个答案:

答案 0 :(得分:2)

根据error_logging_clause

的文档
  

DML错误记录限制

     
      
  • 以下情况导致该语句失败并回滚而未调用错误记录功能:

         

    ...

         
        
    • 任何引发唯一约束或索引冲突的直接路径INSERT或MERGE操作。
    •   
  •   

默认情况下,并行DML使用直接路径写入,但是您可以使用提示NOAPPEND禁用直接路径。这将允许该语句使用并行性,但使用常规写入。它的速度不如并行直接路径写入快,但至少比单线程常规写入要好。