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

Oracle 为什么在并行语句中忽略dml错误日志记录,oracle,error-handling,parallel-processing,Oracle,Error Handling,Parallel Processing,我有一个并行执行的insertselect语句 我正在尝试添加一个dml错误日志记录,以捕获异常 但是,当我改变会话以使用并行时,错误日志就被忽略了 -- 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

我有一个并行执行的
insertselect
语句

我正在尝试添加一个
dml错误日志记录
,以捕获异常

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

-- 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会话
,也会出现这种差异

我正在使用Oracle 11g


根据Oracle文档,我没有看到将
dml错误日志记录
parallel
一起使用的任何限制。

根据

DML错误日志记录的限制

  • 以下情况导致语句失败并回滚,而不调用错误日志功能:

    • 引发唯一约束或索引冲突的任何直接路径插入或合并操作

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

ORA-12801
是一条通用错误消息,指示多个线程中的一个线程何时死亡。捕获整个错误堆栈并将其发布到此处可能会有所帮助。有些错误不会导致日志记录,例如
ORA-00600
。我的错误,具体错误是PK约束Violite。谢谢您的回答。我只是不明白。我没有任何附加提示,唯一的变化是并行。。。启用并行时,为什么优化器会选择直接路径插入?@user2671057使用并行DML时,默认情况下直接路径写入。我对我的答案做了一个小的更新。现在它有意义了。非常感谢。