我有一个示例csv文件,其中包含我想在oracle表中加载的数据。 样本数据就像
1,aa,b,c
2,x,yy,zzz
1,aa,b,c
2,x,yy,zzz
这是两个不同的记录,由第一个字符区分为“1”和“2”,我在db中有一个数据表,其中包含第一个记录的列,然后是第二个记录的列。我试图使用'WHEN'子句加载数据,但问题是它不会按顺序加载数据。它首先加载数据'1'然后加载'2'。 喜欢
ID col1 col2 col3 col4 col5 col6
1 aa b c null null null
1 aa b c null null null
2 null null null x yy zzz
2 null null null x yy zzz
这是加载程序代码:
load data
infile 'C:\sample.csv'
APPEND
INTO TABLE "temp"
WHEN "ID" = '1'
fields terminated by "," optionally enclosed by '"' trailing nullcols
(
Col1,
Col2,
Col3
)
INTO TABLE "temp"
WHEN "ID" = '2'
fields terminated by "," optionally enclosed by '"' trailing nullcols
(
Col4,
Col5,
Col6
)
我只想将数据加载为:
ID col1 col2 col3 col4 col5 col6
1 aa b c null null null
2 null null null x yy zzz
1 aa b c null null null
2 null null null x yy zzz
任何帮助都将不胜感激。
答案 0 :(得分:0)
您可以将其加载到临时表中,添加一个序列号列。然后将其加载到另一个表中,根据需要拆分列。
这未经过测试,但为您提供了一个粗略的想法:
create or replace tmpsequence;
load data
infile 'C:\sample.csv'
APPEND
INTO TABLE "temp"
fields terminated by "," optionally enclosed by '"' trailing nullcols
(
rec_id "tempsequence.nextval",
id,
Col1,
Col2,
Col3
)
create table temp2
select rec_id, id, case when id = "1" then col1 else null end
, case when id = "1" then col2 else null end
, case when id = "1" then col3 else null end
, case when id = "2" then col1 else null end
, case when id = "2" then col2 else null end
, case when id = "2" then col3 else null end
from temp
然后你应该能够看到你想要的东西
select * from temp2 order by rec_id
答案 1 :(得分:0)
使用“CONTINUEIF”从数据文件中的多行记录中汇编逻辑记录。这告诉SQL * Loader在条件匹配时继续运行。在这里,如果下一行的第一个位置为'2',则表示继续。控制文件的结构是不加载record_part编号:
LOAD DATA
infile test.dat
truncate
continueif NEXT (1:1) = '2'
INTO TABLE X_test
fields terminated by ',' TRAILING NULLCOLS
(rec_part FILLER
,col1
,col2
,col3
,col4
,col5
,col6
)
加载后:
如果数据总是在两行上,请替换此行:
continueif NEXT (1:1) = '2'
与
concatenate 2
表示每条逻辑记录在数据中总是2行。
答案 2 :(得分:0)
如果通过sqlloader命令加载数据,则尝试添加参数rows = 1.这将强制sqlloader在表中插入每行数据,从而使文件加载顺序。默认情况下,行计数为64,这就是为什么您没有获得小文件的顺序加载。
希望这会有所帮助..