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的列。