【问题标题】:SQL Loader : Load into 2 Tables from 1 controlfile and 1 CSVSQL 加载器:从 1 个控制文件和 1 个 CSV 加载到 2 个表中
【发布时间】:2010-10-16 20:33:28
【问题描述】:

表T1结构:col1编号,col2编号

Table T2 结构:col1 number,col2 number,col3 number

csv 文件:

row1:1,2,3,4,5,6
row2:1,2,3,4,5,6

我希望表 T1 中的数据为:

col1   col2
=====  ====
1       3
1       3

我希望表 T2 中的数据为:

col1   col2   col3
=====  ====   ==== 
1       3       5
1       3       5

跟随控制文件不工作

load data
infile *
insert into table T1 fields terminated by ',' TRAILING NULLCOLS 
(col1,fill1 filler,col2)
insert into table T2 fields terminated by ',' TRAILING NULLCOLS
(col1,fill2 filler,col2,fill3 filler,col3)
begindata
1,2,3,4,5,6
1,2,3,4,5,6

请帮我解决这个问题。

【问题讨论】:

  • 这是什么版本的sql?请添加标签
  • 如果它解决了您的问题,请接受任何答案..它将帮助其他人...

标签: sql loader load-data-infile


【解决方案1】:

这确实有效,但我不喜欢这种解决方案。在这些情况下,我更喜欢使用外部表。简短的回答是您遇到了问题,因为 SQLLDR 不会自动重新扫描多行导入的数据。以下是文档中的 sn-p。

From the SQLLDR documentation

对多个表加载使用 POSITION

在多表加载中,您指定多个 INTO TABLE 子句。当您为第一个表的第一列指定 POSITION() 时,将相对于逻辑记录的开头计算位置。当您为后续表格的第一列指定 POSITION() 时,位置是相对于最后加载的表格的最后一列计算的。

因此,当后续的 INTO TABLE 子句开始时,位置不会自动设置为逻辑记录的开头。这允许多个 INTO TABLE 子句处理同一物理记录的不同部分。有关示例,请参阅提取多个逻辑记录。

逻辑记录可能包含两个表之一的数据,但不能同时包含两个表。在这种情况下,您将重置 POSITION。在 INTO TABLE 子句的第一个字段中不要省略位置说明或使用 POSITION(*+n),而是使用 POSITION(1) 或 POSITION(n)。

    load data
    infile * 
    truncate
    into table T1 
    fields terminated by ',' trailing nullcols
    ( col1  
    , fill1 filler
    , col2  )
    into table T2 
    fields terminated by ','  trailing nullcols
    ( col1 position(1) 
    , filler filler
    , col2    
    , filler2 filler
    , col3 )   

BEGINDATA
1,2,3,4,5,6
1,2,3,4,5,6

SQL> select * From t1;

      COL1       COL2
---------- ----------
         1          3
         1          3

SQL> select* From t2;

      COL1       COL2       COL3
---------- ---------- ----------
         1          3          5
         1          3          5

【讨论】:

  • 感谢 Neil +1 提供详细代码,特别是 col1 位置(1)
【解决方案2】:

试试这个

LOAD DATA  
INFILE * "STR '|EndRec|'"  
INSERT INTO TABLE T1 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1, FILL2 FILLER, COL2, FILL4 FILLER, FILL5 FILLER, FILL6 FILLER)  
INSERT INTO TABLE T2 FIELDS TERMINATED BY ',' TRAILING NULLCOLS
(COL1 POSITION(1), FILL2 FILLER, COL2, FILL3 FILLER, COL3, FILL6 FILLER)

BEGINDATA  
1,2,3,4,5,6|EndRec|1,2,3,4,5,6|EndRec|

【讨论】:

    【解决方案3】:

    试试这个:

    LOAD DATA
    INFILE *
    INSERT INTO TABLE T1 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
    (COL1, FILL2 FILLER, COL2, FILL4 FILLER, FILL5 FILLER, FILL6 FILLER)
    INSERT INTO TABLE T2 FIELDS TERMINATED BY ',' TRAILING NULLCOLS
    (COL1, FILL2 FILLER, COL2, FILL3 FILLER, COL3, FILL6 FILLER)
    BEGINDATA
    1,2,3,4,5,6
    1,2,3,4,5,6
    

    【讨论】:

    • 查看我的回复(在下方,希望很快会在上方)。多个 INTO 子句要求您重置逻辑指针,否则您会看到 4、5、6 进入 t2。 position() 命令将重置指针。正因为如此,将位置数据加载到多个表中总是更容易。
    • 手边没有 SQL*Loader,所以我只相信你的话 :)
    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多