Oracle Merge Append提示导致ORA-01400

时间:2018-08-01 07:59:50

标签: oracle merge parallel-processing append

我有一个无法理解的错误。在某些生产代码上会发生这种情况,但是我创建了虚拟表来模拟该问题。

create table dl_test_nullable_src(col1 varchar2(20) NOT NULL, col2 varchar2(20) NOT NULL);
create table dl_test_nullable_tgt(col1 varchar2(20) NOT NULL, col2 varchar2(20) NOT NULL);

begin
for i in 1..10 loop
  insert into dl_test_nullable_src(col1,col2) values(i*100,i*300);
  insert into dl_test_nullable_tgt(col1,col2) values(i*100,i*300);
end loop;
commit;
end;

下面的作品

merge into dl_test_nullable_tgt tgt
using
(select * from dl_test_nullable_src) src
 on (tgt.col1 = src.col1)
when matched then update
set tgt.col2 = src.col2
when not matched then insert
(tgt.col2)
 values
(src.col2);

10行合并。

现在,我添加一些并行并附加到直接路径中以加载任何新记录。

alter session enable parallel dml; 

merge /*+ append parallel(tgt,4) */ into dl_test_nullable_tgt tgt
using
(select * from dl_test_nullable_src) src
 on (tgt.col1 = src.col1)
when matched then update
set tgt.col2 = src.col2
when not matched then insert
(tgt.col2)
 values
(src.col2);

SQL错误:ORA-01400:无法将NULL插入(“ PBTUSER5”。“ DL_TEST_NULLABLE_TGT”。“ COL1”) 01400. 00000-“无法将NULL插入(%s)” *原因:试图将NULL插入先前列出的对象。 *操作:这些对象不能接受NULL值。

即使这本身没有意义,但也不应尝试插入任何记录,因为SRC表中的所有内容都在TGT表中。唯一的绕过方法是在insert和values子句中添加col1。

Table Contents

1 个答案:

答案 0 :(得分:1)

据我所见,

在MOS文档1547251.1中进行了描述-分类为“不是bug,而是功能”。区别是基于并行和非并行执行中约束的评估。