表T1结构:col1编号,col2编号
表T2结构:col1编号,col2编号,col3编号
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
请帮我解决这个问题。
答案 0 :(得分:2)
这确实有效,但我不喜欢这个解决方案。在这些情况下,我更喜欢使用外部表。简短的回答是您遇到了问题,因为SQLLDR不会自动重新扫描多行导入的数据。文档中的代码片段如下。
使用具有多个表载荷的POSITION
在多表加载中,指定多个INTO TABLE子句。为第一个表的第一列指定POSITION()时,将相对于逻辑记录的开头计算位置。为后续表的第一列指定POSITION()时,将相对于上次加载的表的最后一列计算位置。
因此,当后续的INTO TABLE子句开始时,该位置不会自动设置为逻辑记录的开头。这允许多个INTO TABLE子句处理同一物理记录的不同部分。有关示例,请参阅提取多个逻辑记录。
逻辑记录可能包含两个表之一的数据,但不包含两个表。在这种情况下,您将重置POSITION。不要省略位置规范或使用POSITION(* + n)作为INTO TABLE子句中的第一个字段,而是使用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
答案 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|
答案 2 :(得分:0)
试试这个:
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