sqlldr交叉导入列值

1647阅读 0评论2011-08-23 TOMSYAN
分类:Oracle

同事的需求,描述的比较别扭,大体意思如下:

SQL> DESC TEST;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ID                                                 CHAR(1)
 COL1                                               VARCHAR2(4)
 COL2                                               VARCHAR2(4)
 
ID,COL1,COL2
1,A,1
2,B,2
3,C,3
4,D,4
5,F,5
 
数据文件中的这3个列的值对应表的列。
当ID=5的时候, 第一列导入ID,第二列导入COL1,第三列导入COL2
当ID<>5的时候,第一列导入ID,第二列导入COL2,第三列导入COL1
 
 
 
实现如下:
 
 
SQL> HOST TYPE DATA.CTL
LOAD DATA
INFILE 'c:\data.txt'
 

APPEND INTO TABLE TEST
WHEN ID='5'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(ID ,COL1,COL2)

INTO TABLE TEST
WHEN ID<>'5'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(ID POSITION(1),COL2,COL1) --这个地方必须带上POSITION(1),否则只能导入到第一个表中
 
SQL> HOST TYPE DATA.TXT
1,A,1
2,B,2
3,C,3
4,D,4
5,F,5

SQL> host sqlldr test/test control=c:\data.ctl
 
SQL*Loader: Release 10.2.0.1.0 - Production on 星期二 8月 23 16:30:36 2011
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
达到提交点 - 逻辑记录计数 4
达到提交点 - 逻辑记录计数 5
 
SQL> SELECT * FROM TEST;
 
I COL1 COL2
- ---- ----
1 1    A
2 2    B
3 3    C
4 4    D
5 F    5
SQL>
上一篇:can't create your crontab file in the crontab
下一篇:enq: TX - index contention模拟