我想避免使用 SQL Loader 将所有记录插入到表中。我们要插入的表有一个超过 3 列的主键。每当发生重复时,代码都会因主键违规而失败。
我需要在使用控制文件插入时跳过/避免在数据文件中出现多次的所有记录。有人可以帮我吗?
有没有办法通过在控制文件本身中添加一些条件来跳过这些记录?
我想避免使用 SQL Loader 将所有记录插入到表中。我们要插入的表有一个超过 3 列的主键。每当发生重复时,代码都会因主键违规而失败。
我需要在使用控制文件插入时跳过/避免在数据文件中出现多次的所有记录。有人可以帮我吗?
有没有办法通过在控制文件本身中添加一些条件来跳过这些记录?
对我来说,您似乎在寻找问题,而根本没有问题。
.log
文件中.bad
文件中以防万一你不知道,有errors
参数;它的值是整数,它显示您希望允许多少错误:
那么,问题是什么?我没有看到。
看起来 - 在重复的情况下 - 你不想加载任何这些行,因为你不知道哪一个是正确的,我不认为 SQL Loader 能够做到这一点。
一种选择是切换到以输入文件为源并充当“普通”表的外部表SELECT
,并允许您直接编写语句,而无需事先将数据加载到数据库中。它使您可以跳过重复项,例如
insert into target_table (col1, col2, ...)
select col1, col2, ...
from external_table a
where (a.pkcol1, a.pkcol2, pkcol3) not in
(select b.pkcol1, b.pkcol2, b.pkcol3
from external_table b
group by b.pkcol1, b.pkcol2, b.pkcol3
having count(*) > 1
);
或者,您可以禁用主键约束,像现在一样加载数据(包括重复项),然后删除所有重复项,例如
delete from target_table a
where (a.pkcol1, a.pkcol2, pkcol3) in
(select b.pkcol1, b.pkcol2, b.pkcol3
from target_table b
group by b.pkcol1, b.pkcol2, b.pkcol3
having count(*) > 1
);
然后重新启用主键约束。