0

我想避免使用 SQL Loader 将所有记录插入到表中。我们要插入的表有一个超过 3 列的主键。每当发生重复时,代码都会因主键违规而失败。

我需要在使用控制文件插入时跳过/避免在数据文件中出现多次的所有记录。有人可以帮我吗?

有没有办法通过在控制文件本身中添加一些条件来跳过这些记录?

4

1 回答 1

1

对我来说,您似乎在寻找问题,而根本没有问题。

  • 有一张桌子
  • 它有一个主键约束集
  • 有一个包含数据的文件,其中一些是重复的(根据主键列的含义)
  • 加载会话开始
  • 满足所有条件的行成功加载到表中
  • 不加载 违反任何内容(包括主键约束)的行
    • 它(错误)记录在.log文件中
    • 这些行现在在.bad文件中
  • 加载完成后,表仅包含不同的行

以防万一你不知道,有errors参数;它的值是整数,它显示您希望允许多少错误:

  • 默认为 50
  • 如果您不想允许任何错误,请将其设置为 0
  • 如果您想允许任意数量的错误,请将其设置为非常高的值

那么,问题是什么?我没有看到。


看起来 - 在重复的情况下 - 你不想加载任何这些行,因为你不知道哪一个是正确的,我不认为 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
            );

然后重新启用主键约束。

于 2020-04-18T17:15:14.727 回答