使用SQLLDR加载分隔数据时删除数据字段

Vin*_*dav 4 oracle11g plsqldeveloper sql-loader

考虑以下情况:

T1 (f1, f2, f3);

数据文件:

a|b|c|d
w|x|y|z
Run Code Online (Sandbox Code Playgroud)

我想加载跳过第二个字段的数据,如下所示:

f1    f2    f3 
---   ---   ---
a     d     c
w     z     y
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助或构建控制文件中的任何指针来实现此目的.

Gar*_*y_W 12

将要跳过的列定义为FILLER.请记住,控制文件中列的顺序通常是它们在数据文件中的顺序.如果名称与表中的列匹配,那么它就是它的位置.

...
(
  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
)
Run Code Online (Sandbox Code Playgroud)

换句话说,控制文件中列的顺序与它们在数据文件中的顺序相匹配,而不是它们在表中的顺序.这与名称相匹配,而非订单.

编辑 - 我添加了一些注释以供解释,但我相信它们不能在实际文件中处于该位置.请参阅下面的完整示例:

创建表格:

CREATE TABLE T1
(
  F1  VARCHAR2(50 BYTE),
  F2  VARCHAR2(50 BYTE),
  F3  VARCHAR2(50 BYTE)
);
Run Code Online (Sandbox Code Playgroud)

控制文件,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
Run Code Online (Sandbox Code Playgroud)

运行:

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
Run Code Online (Sandbox Code Playgroud)

从表中选择:

在此输入图像描述

希望这会有所帮助.