我有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 logging
与parallel
一起使用的任何限制。
答案 0 :(得分:2)
DML错误记录限制
以下情况导致该语句失败并回滚而未调用错误记录功能:
...
- 任何引发唯一约束或索引冲突的直接路径INSERT或MERGE操作。
默认情况下,并行DML使用直接路径写入,但是您可以使用提示NOAPPEND
禁用直接路径。这将允许该语句使用并行性,但使用常规写入。它的速度不如并行直接路径写入快,但至少比单线程常规写入要好。