Oracle11g 使用SQLLDR加载分隔数据时跳过数据字段
考虑以下场景: 表Oracle11g 使用SQLLDR加载分隔数据时跳过数据字段,oracle11g,plsqldeveloper,sql-loader,Oracle11g,Plsqldeveloper,Sql Loader,考虑以下场景: 表T1(f1、f2、f3) 数据文件: a|b|c|d w|x|y|z 我希望加载此数据,跳过第二个字段,如下所示: f1 f2 f3 --- --- --- a d c w z y 非常感谢您的帮助或任何指针在构造控制文件来实现这一点 定义要跳过作为填充的列。请记住,控制文件中列的顺序通常与数据文件中列的顺序相同。如果名称与表中的一列匹配,则将转到该列 ... ( f1 CHAR, -- 1st field in
T1(f1、f2、f3)代码>
数据文件:
a|b|c|d
w|x|y|z
我希望加载此数据,跳过第二个字段,如下所示:
f1 f2 f3
--- --- ---
a d c
w z y
非常感谢您的帮助或任何指针在构造控制文件来实现这一点 定义要跳过作为填充的列。请记住,控制文件中列的顺序通常与数据文件中列的顺序相同。如果名称与表中的一列匹配,则将转到该列
...
(
f1 CHAR, -- 1st field in the file, goes to column named f1 in the table
X FILLER, -- 2nd field in the file, ignored
f3 CHAR, -- 3rd field in the file, goes to column named f3 in the table
f2 CHAR -- 4th field in the file, goes to column named f2 in the table
)
换句话说,控制文件中列的顺序与它们在数据文件中的顺序相匹配,而不是它们在表中的顺序。按名称匹配,而不是按顺序匹配
编辑-我添加了一些注释进行解释,但我相信它们在实际文件中不可能处于该位置。请参见下面的完整示例:
创建表:
CREATE TABLE T1
(
F1 VARCHAR2(50 BYTE),
F2 VARCHAR2(50 BYTE),
F3 VARCHAR2(50 BYTE)
);
控制文件example.ctl:
load data
infile *
truncate
into table t1
fields terminated by '|' trailing nullcols
(
f1 CHAR,
x FILLER,
f3 CHAR,
f2 CHAR
)
BEGINDATA
a|b|c|d
w|x|y|z
运行它:
C:\temp>sqlldr userid=login/password@database control=example.ctl
SQL*Loader: Release 11.2.0.1.0 - Production on Wed Apr 22 11:25:49 2015
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 2
从表中选择:
希望这能有所帮助。非常感谢您的帮助。由于考虑中的表的大小,已经有大约35GB的数据,所以我考虑并希望避免这种特殊的方法。而且,这不是一个一次性的过程,因此不确定这是否是一个好的方法。你能在这里建议其他方法吗?我认为不需要。这就是跳过字段并生成可重用控制文件的方法。除非您想编写某种程序,在加载之前去掉不需要的字段,但仍然需要一个控制文件。也许我不明白为什么这个方法会引起关注?非常感谢!现在我有了主意。是的,我们可以通过在表中定义一个新的虚拟/填充列并将不需要的数据字段映射到填充项来使控制文件可重用。不,表中不需要虚拟/填充项。在我上面给出的示例中,字段“X”是第二行,它对应于数据文件中的第二个字段。因为它是填充物,所以被忽略。表中没有名为“X”的列。您只需在控制文件中对其命名,使其与列名不匹配。该表只有名为f1、f2和f3的列。