sqlldr - 如何将多个 csv 加载到多个 table
sqlldr - how to load multiple csv to multple table
第一个问题:我正在尝试加载 test1.csv、test2.csv 和 test3.csv 到 table1、table2 和 table3分别使用SQLLDR。请原谅我缺乏这方面的知识,在 .ctl 文件中定义它时我无法完全正确,我只能想到下面的代码,但这是不正确的。所以我的问题是我怎样才能做到这一点或者这可能吗?
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)"
)
第二个问题:这是第一个问题的替代方法。由于我无法弄清楚第一个,我所做的是将每个 table 的负载拆分为多个 .ctl 文件,并在一个 .bat 文件中调用这三个文件。这至少有效,但我的问题是有没有一种方法可以在一个会话中处理所有这 3 个 .ctl 文件,而无需像下面那样提及 user/password 3 次?
sqlldr userid=user/pass@server control=test1.ctl
sqlldr userid=user/pass@server control=test2.ctl
sqlldr userid=user/pass@server control=test3.ctl
如果可以使用一个字段来指示 table 该文件数据的目的,您可以使用多个 INFILE
语句来执行类似的操作。假设第一个字段是该指标,它不会被加载(将其定义为 FILLER,以便 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)"
)
所以从逻辑上讲,每个 INTO table WHEN 部分处理每个文件。虽然不是那么灵活,但可以说更难维护。为了便于维护,您可能只希望每个文件都有一个控制文件?如果所有文件和 table 都是相同的布局,您还可以将它们全部加载到同一个阶段 table(带有指示器)以便于加载,然后以编程方式将它们拆分到单独的 tables 之后。该方法的优点是加载速度更快、更容易,并且可以更好地控制拆分到流程的单独 table 部分。只是一些其他的想法。每种方法我都做了,看需求和你能改什么。
第一个问题:我正在尝试加载 test1.csv、test2.csv 和 test3.csv 到 table1、table2 和 table3分别使用SQLLDR。请原谅我缺乏这方面的知识,在 .ctl 文件中定义它时我无法完全正确,我只能想到下面的代码,但这是不正确的。所以我的问题是我怎样才能做到这一点或者这可能吗?
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)"
)
第二个问题:这是第一个问题的替代方法。由于我无法弄清楚第一个,我所做的是将每个 table 的负载拆分为多个 .ctl 文件,并在一个 .bat 文件中调用这三个文件。这至少有效,但我的问题是有没有一种方法可以在一个会话中处理所有这 3 个 .ctl 文件,而无需像下面那样提及 user/password 3 次?
sqlldr userid=user/pass@server control=test1.ctl
sqlldr userid=user/pass@server control=test2.ctl
sqlldr userid=user/pass@server control=test3.ctl
如果可以使用一个字段来指示 table 该文件数据的目的,您可以使用多个 INFILE
语句来执行类似的操作。假设第一个字段是该指标,它不会被加载(将其定义为 FILLER,以便 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)"
)
所以从逻辑上讲,每个 INTO table WHEN 部分处理每个文件。虽然不是那么灵活,但可以说更难维护。为了便于维护,您可能只希望每个文件都有一个控制文件?如果所有文件和 table 都是相同的布局,您还可以将它们全部加载到同一个阶段 table(带有指示器)以便于加载,然后以编程方式将它们拆分到单独的 tables 之后。该方法的优点是加载速度更快、更容易,并且可以更好地控制拆分到流程的单独 table 部分。只是一些其他的想法。每种方法我都做了,看需求和你能改什么。