【问题标题】:Oracle SQL Loader split data into different tablesOracle SQL Loader 将数据拆分到不同的表中
【发布时间】:2010-11-05 23:13:41
【问题描述】:

我有一个如下所示的数据文件:

    1            2          3        4             5            6    
FirstName1 | LastName1 | 4224423 | Address1 | PhoneNumber1 | 1/1/1980
FirstName2 | LastName2 | 4008933 | Address1 | PhoneNumber1 | 1/1/1980
FirstName3 | LastName3 | 2344327 | Address1 | PhoneNumber1 | 1/1/1980
FirstName4 | LastName4 | 5998943 | Address1 | PhoneNumber1 | 1/1/1980
FirstName5 | LastName5 | 9854531 | Address1 | PhoneNumber1 | 1/1/1980

我的数据库有 2 个表,一个用于 PERSON,一个用于 ADDRESS,所以我需要存储列 1、2、3 和 6 在 PERSON 和列 4 和 5 在 ADDRESS。 SQL Loader 文档中提供的所有示例都解决了这种情况,但仅适用于固定大小的列,并且我的数据文件是用竖线分隔的(并且不能将其分成 2 个不同的数据文件)。

有人知道怎么做吗?

我们将一如既往地为您提供帮助。

【问题讨论】:

    标签: oracle multiple-tables csv sql-loader


    【解决方案1】:

    另一种选择可能是将文件设置为external table,然后运行插入,从外部表中选择所需的列。

    【讨论】:

    • 嗯,这个想法很有趣
    • 其他选项是运行文件两次;第一次您只获取第一个表所需的内容,并使用 FILLER 语句忽略其余部分。你对第二张桌子做同样的事情。
    【解决方案2】:
    options(skip=1)
    load data
    infile "csv file path"
    insert into table person
    fields terminated by ','
    optionally enclosed by '"'
    trialling nullcols(1,2,3,6)
    
    insert into table address
    fields terminated by ','
    optionally enclosed by '"'
    trialling nullcols(4,5)
    

    【讨论】:

      【解决方案3】:

      即使 SQLLoader 不支持这一点(我不确定),也没有什么能阻止您使用 awk 对其进行预处理然后加载。例如:

      cat 1.dat | awk -F '|' '{print $1 $2 $3 $6}' > person.dat
      cat 1.dat | awk -F '|' '{print $4 $5}' > address.dat
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 2019-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-13
        • 1970-01-01
        相关资源
        最近更新 更多