我有一个无法理解的错误。在某些生产代码上会发生这种情况,但是我创建了虚拟表来模拟该问题。
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。
答案 0 :(得分:1)
在MOS文档1547251.1中进行了描述-分类为“不是bug,而是功能”。区别是基于并行和非并行执行中约束的评估。