本节所讲的数据文件与目标表数目不一致指2种情况:第一种,多个数据文件加载到单个目标表中;第二种,单个数据文件加载多个目标表中。
1.多个数据文件加载到单个目标表中
下面就将数据文件test06.dat、test07.dat、test08.dat加载到LoadTest表为例,数据文件内容分别如下:
数据文件test06.dat如下:
45,data,update
46,clicl,insert
47,wang,replace
48,sing,insert
数据文件test07.dat如下:
51,fgu,update
52,kll,insert
数据文件test08.dat如下:
53,fgfh,update
54,tt,insert
55,gg,replace
对应该数据文件的控制文件test06.ctl如下:
LOAD DATA
INFILE test06.dat
INFILE test07.dat
INFILE test08.dat
DISCARDFILE 'test06.dsc'
TRUNCATE
INTO TABLE LOADTEST
FIELDS TERMINATED BY","
(LOADID, OPERNAME,OPERTYPE)
运行SQL*Loader,加载数据,
[oracle@nn ~]$ sqlldr nn/123 control=/home/oracle/test06.ctl
通过SQL*Plus查询加载结果:
SQL> SELECT t.* FROM loadtest t;
2.单个数据文件加载多个目标表中
比如,将数据文件test09.dat中OPERTYPE字段值为“insert”的数据导入到LOADIN表中,字段值为“update”的数据导入到LOADUP表中。
数据文件test09.dat如下:
1,data,update
2,,insert
3,yju,replace
4,sing,insert
5,hyui,update
6,clicl,insert
7,gg,replace
8,dfh,insert
对应该数据文件的控制文件test09.ctl如下:
LOAD DATA
INFILE test09.dat
DISCARDFILE 'test09.dsc'
TRUNCATE
INTO TABLE LOADIN WHEN OPERTYPE='insert'
FIELDS TERMINATED BY","
TRAILING NULLCOLS
(LOADID, OPERNAME,OPERTYPE)
INTO TABLE LOADUP WHEN OPERTYPE='update'
FIELDS TERMINATED BY","
(LOADID POSITION(1), OPERNAME POSITION(3:6),OPERTYPE POSITION(8:14))
注意:同一个文件导入到2张以上表的情况,when后面必须要个POSITION,否则第2张表加载不了。
运行SQL*Loader,加载数据,
[oracle@nn ~]$ sqlldr nn/123 control=/home/oracle/test09.ctl
通过SQL*Plus查询加载结果,可见OPERTYPE字段值为“insert”的数据导入到LOADIN表中,字段值为“update”的数据导入到LOADUP表中,其他的数据存入了test09.dsc文件中。
SQL> SELECT t.* FROM loadin t;
SQL> SELECT t.* FROM loadup t;