2016-07-05 19 views
0

1问题:我试图加载test1.csvtest2.csvtest3.csv表1表2表3分别使用SQLLDR。如果知道这方面的知识,请耐心等待,如果在.ctl文件中定义这个问题时我无法完全理解,只有我能想到的是下面的代码,但这是不正确的。所以我的问题是我怎么能做到这一点或者这是可能的?SQLLDR - 如何加载多个CSV到multple表

OPTIONS (SKIP=1) 
LOAD DATA 

INFILE 'test1.csv' 
INFILE 'test2.csv' 
INFILE 'test2.csv' 

TRUNCATE 

INTO TABLE table1 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Col1 "TRIM(:Col1)", 
    Col2 "TRIM(:Col2)" 
) 


INTO TABLE table2 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Colx "TRIM(:Colx)", 
    Coly "TRIM(:Coly)" 
) 


INTO TABLE table3 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Colp "TRIM(:Colp)", 
    Colq "TRIM(:Colq)" 
) 

第二个问题:这是第一个问题的替代方案。由于我无法弄清楚第一个问题,我所做的就是将每个表的负载拆分为多个.ctl文件,并将这三个文件全部调用到.bat文件中。这至少起作用,但我的问题是有没有办法在会话中处理所有这3个.ctl文件,而不提及用户/密码3次?

sqlldr userid=user/[email protected] control=test1.ctl 
sqlldr userid=user/[email protected] control=test2.ctl 
sqlldr userid=user/[email protected] control=test3.ctl 
+0

是否已经存在或可以在数据中添加一个指示器字段,用于键入数据应该发送到哪个表上? –

+0

我没有使用任何列作为区分数据的关键,但我可以通过添加密钥进行尝试。 – Chito

回答

0

如果有可以使用它可以表明文件的数据被用于该表中的字段,您可以使用多个INFILE satements做这样的事情。比方说,第一场是指示灯,它不会被加载(其定义为填充物,以便将SQLLDR忽略):

... 
INTO TABLE table1 
WHEN (01) = 'TBL1' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Col1 "TRIM(:Col1)", 
    Col2 "TRIM(:Col2)" 
) 

INTO TABLE table2 
WHEN (01) = 'TBL2' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Colx "TRIM(:Colx)", 
    Coly "TRIM(:Coly)" 
) 


INTO TABLE table3 
WHEN (01) = 'TBL3' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Colp "TRIM(:Colp)", 
    Colq "TRIM(:Colq)" 
) 

所以逻辑上,每进表时部分处理每个文件。虽然并不那么灵活,但可以说难以维持。为了便于维护,您可能只想为每个文件设置一个控制文件?如果所有文件和表格都是相同的布局,您也可以将它们全部加载到相同的临时表格(使用指示器)以便于加载,然后将它们以编程方式分解到单独的表格中。该方法的优点是加载速度更快,更容易,并且可以更好地控制分解到流程的单独表部分。只是一些其他的想法。我已经完成了每种方法,取决于需求和你能够改变的方面。

+0

我得到了你说的,可能最好让他们全部分开。 – Chito

+0

回到第二个问题,有没有办法添加上面给出的例子以外的多个.ctl文件? – Chito

+0

您可以给'sqlldr'命令行参数之一是一个参数文件,它可以包含userid信息。这与它自己的安全问题有关。有关详细信息,请参阅此处:http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_params.htm#i1005781。否则,我认为你将不得不以编程方式想出一个方法来调用'sqlldr',每次传递不同的参数。这就是我们所做的。我们有一个表格,用于保存每个文件的加载设置,并且一个调度程序读入,构建一个命令行并运行它。 –

相关问题