我想使用外部表来加载csv文件,因为它非常方便,但问题是如何确保我不会连续两次加载相同的文件?我无法验证加载的数据,因为它可能与以前的信息相同;我需要找到一种方法来确保用户不会像2小时前那样加载相同的文件。 我想过每次使用不同的名称上传文件并发出alter table命令来更改外部表定义中文件的名称,但这听起来有点危险。 我还想过用序列标记文件中的每一行来帮助区分文件,但我怀疑客户端会接受它,因为他们需要手动执行此操作(文件从某处导出)。
有没有更好的方法可以确保我不会在外部表格中加载相同的文件,除非更改文件的名称并在表格上执行更改?
谢谢
答案 0 :(得分:0)
当您将数据从external table
带到数据库时,您可以使用MERGE命令而不是insert
。它让您不必担心重复数据
更重要的是,我们可以将整个转型过程包含在内 一个Oracle MERGE命令,引用外部表和表 在一个命令中作为MERGED Oracle数据的源。
alter session enable parallel dml;
merge /*+ parallel(contract_dim,10) append */
into contract_dim d
using TABLE(trx.go(
CURSOR(select /*+ parallel(contracts_file,10) full (contracts_file) */ *
from contracts_file ))) f
on d.contract_id = f.contract_id
when matched then
update set desc = f.desc,
init_val_loc_curr = f.init_val_loc_curr,
init_val_adj_amt = f.init_val_adj_amt
when not matched then
insert values ( f.contract_id,
f.desc,
f.init_val_loc_curr,
f.init_val_adj_amt);
所以我们有它 - 我们复杂的ETL函数都包含在一个 单个Oracle MERGE语句。没有单独的SQL * Loader阶段,没有 临时表,所有管道并行并行加载
答案 1 :(得分:0)
我只能想到一个像这样的解决方案: