SQL Loader从CSV输入文件加载多个表

时间:2016-12-08 16:23:15

标签: oracle sql-loader

我正在尝试加载一个CSV文件,其中每行数据都加载到两个表(TAB1,TAB2)中。    对于CSV文件中的每一行数据,将在TAB1中加载一行,在第二个表中加载多行。

CSV文件中的数据行示例:

Data_col1,Data_col2,Data_col3,Data_col4   , Key_name1, Key_value1 , Key_name2, Key_value2 ,Key_name3, Key_value3 ,.................

我期待这些数据如下表所示:

     Tab1
     ====
   Data_col1
   Data_col2
   Data_col3
   Data_col4 

   Tab2  ( Load data in TAB2 until the end of the data row1)                    
      record 1 ==> Key_name1, Key_value1
      record 2 ==> Key_name2, Key_value2
      record 3 ==> Key_name3, Key_value3

我做了一些研究,但无法解决这个问题。 请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

如何首先加载到单个导入表中,然后使用脚本处理数据并将其加载到两个表中?

答案 1 :(得分:0)

通常这种情况会要求预先处理文件以在加载之前拆分记录,或者如@MercyfulGPF建议的那样,加载到临时表并运行一个过程来将行处理到它们的表中(这将是我喜欢的方法因为它允许你更多地控制过程,你可以处理可变数量的键名/值对。)

但是,如果您拥有固定数量的元素并且不介意维护噩梦,那么您可以提出要求。使用多个“INTO TABLE”部分构造控制文件,第一个字段从位置(1)开始。这会强制sqlldr将其内部指针移回每个INTO表部分的行的开头,为每个部分插入一个新行。每个部分都将已经插入的字段定义为FILLER,以便跳过它们(确保它们的名称与表列不同)。如果您的示例建议存在可变数量的key_name / value对,则它将不起作用。所以这可能只是一个部分解决方案,但可能会给你一些可能(或不可能)的想法。

LOAD DATA
infile datafile.csv 
TRUNCATE

INTO TABLE tab1
fields terminated by ','
( 
 data_col
)

INTO TABLE tab1
fields terminated by ','
( 
 filler1 FILLER position(1)
,data_col
)

INTO TABLE tab1
fields terminated by ','
( 
 filler1 FILLER position(1)
,filler2 FILLER
,data_col
)

INTO TABLE tab1
fields terminated by ','
( 
 filler1 FILLER position(1)
,filler2 FILLER
,filler3 FILLER
,data_col
)

INTO TABLE tab2
fields terminated by ','
( 
 filler1 FILLER position(1)
,filler2 FILLER
,filler3 FILLER
,filler4 FILLER
,key_name
,key_value
)

INTO TABLE tab2
fields terminated by ','
( 
 filler1 FILLER position(1)
,filler2 FILLER
,filler3 FILLER
,filler4 FILLER
,filler5 FILLER
,filler6 FILLER
,key_name
,key_value
)
...