外部表格:如何确保我不加载相同的文件/数据

时间:2015-11-20 09:37:08

标签: oracle csv plsql import external-tables

我想使用外部表来加载csv文件,因为它非常方便,但问题是如何确保我不会连续两次加载相同的文件?我无法验证加载的数据,因为它可能与以前的信息相同;我需要找到一种方法来确保用户不会像2小时前那样加载相同的文件。 我想过每次使用不同的名称上传文件并发出alter table命令来更改外部表定义中文件的名称,但这听起来有点危险。 我还想过用序列标记文件中的每一行来帮助区分文件,但我怀疑客户端会接受它,因为他们需要手动执行此操作(文件从某处导出)。

有没有更好的方法可以确保我不会在外部表格中加载相同的文件,除非更改文件的名称并在表格上执行更改?

谢谢

2 个答案:

答案 0 :(得分:0)

当您将数据从external table带到数据库时,您可以使用MERGE命令而不是insert。它让您不必担心重复数据

请参阅有关The Oracle Merge Command

的博客
  

更重要的是,我们可以将整个转型过程包含在内   一个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)

我只能想到一个像这样的解决方案:

  1. 在数据文件名中编码时间戳(例如:YYYYMMDDHHMISS-file.csv),其中YYYYMMDDHHMISS是时间戳。
  2. 创建一个包含字段timestamp(如上所示)的表。
  3. 创建一个shell脚本:
    • 从datafilename中提取时间戳。
    • 以时间戳作为参数调用sqlscript,如果该时间戳不存在,则返回0;如果时间戳已经存在,则返回0;在这种情况下,使用错误退出脚本:File:YYYYMMDDHHMISS-file .csv已经加载。
    • 将YYYYMMDDDHHMISS-file.csv复制到input-file.csv。
    • 运行加载input-file.csv文件的sql loader脚本
    • 成功时:运行第二个带有参数timestamp的sql脚本,该脚本在数据库中插入记录以指示文件已加载并将原始文件移动到备份文件夹。
    • 失败时:报告加载脚本失败。