oracle sql loader在同一个表的不同列中加载数据

时间:2013-06-11 15:52:26

标签: sql oracle plsql sql-loader

我有一个示例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

任何帮助都将不胜感激。

3 个答案:

答案 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
)

加载后:

enter image description here

如果数据总是在两行上,请替换此行:

continueif NEXT (1:1) = '2'

concatenate 2

表示每条逻辑记录在数据中总是2行。

答案 2 :(得分:0)

如果通过sqlloader命令加载数据,则尝试添加参数rows = 1.这将强制sqlloader在表中插入每行数据,从而使文件加载顺序。默认情况下,行计数为64,这就是为什么您没有获得小文件的顺序加载。

希望这会有所帮助..