本文主要是介绍SQL*Loader的使用总结(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SQL*Loader对不同文件及格式的处理方法
1.多个数据文件,导入同一张表
通常对于逻辑比较复杂的系统可能存在这种情况,因为导出的数据来源于多个系统, 因此可能提供给DBA的也是多个数据文件。这种情况并不一定需要执行多次加载,只需要在控制文件中做适当配置即可。不过有一点非常重要,提供的数据文件中的数据存放格式必须完全相同。
创建演示表Manager表
--创建Manager表
CREATE TABLE MANAGER
(
MGRNO NUMBER,
MNAME VARCHAR2(30),
JOB VARCHAR2(300),
REMARK VARCHAR2(4000)
);
Table created.
有多个数据文件,分别如下:
--数据文件1
[oracle@cancer ~]$ cat ldr_case8_1.dat
10,SMITH,SALES MANAGER
11,ALLEN.W,TECH MANAGER
16,BLAKE,HR MANAGER--数据文件2
[oracle@cancer ~]$ cat ldr_case8_2.dat
12,WARD,SERVICE MANAGER
13,TURNER,SELLS DIRECTOR
15,JAMES,HR DIRECTOR--数据文件3
[oracle@cancer ~]$ cat ldr_case8_3.dat
17,MILLER,PRESIDENT
创建控制文件,制定多个INFILE参数即可,控制文件如下:
--控制文件
[oracle@cancer ~]$ cat ldr_case8.ctl
LOAD DATA
INFILE ldr_case8_1.dat
INFILE ldr_case8_2.dat
INFILE ldr_case8_3.dat
TRUNCATE INTO TABLE MANAGER
FIELDS TERMINATED BY ","
(MGRNO,MNAME,JOB)
执行sqlldr命令,并查看结果
--执行sqlldr命令
[oracle@cancer ~]$ sqlldr scott/tiger control=ldr_case8.ctl
Commit point reached - logical record count 3
Commit point reached - logical record count 6
Commit point reached - logical record count 7--查看结果
SQL> select * from manager;MGRNO MNAME JOB REMARK
---------- ---------- -------------------- ----------10 SMITH SALES MANAGER11 ALLEN.W TECH MANAGER16 BLAKE HR MANAGER12 WARD SERVICE MANAGER13 TURNER SELLS DIRECTOR15 JAMES HR DIRECTOR17 MILLER PRESIDENT
2.同一个数据文件,导入不同表控制文件提供了多种逻辑判断方式,只要能把逻辑清晰地描述出来,SQL*Loader就能 按照指定的逻辑执行加载。
数据文件如下:
--数据文件
[oracle@cancer ~]$ cat ldr_case9.dat
BON SMITH CLEAK 3904
BON ALLEN SALER,M 2891
BON WARD SALER,"S" 3128
BON KING PRESIDENT 2523
MGR 10 SMITH SALES MANAGER
MGR 11 ALLEN.W TECH MANAGER
MGR 16 BLAKE HR MANAGER
TMP SMITH 7369 CLERK 1020 20
TMP ALLEN 7499 SALESMAN 1930 30
TMP WARD 7521 SALESMAN 1580 30
TMP JONES 7566 MANAGER 3195 20
需求是将MGR开头的记录导入到Manager表,以BON开头的记录导入到BONUS表,其他记录存放到废弃文件中,创建控制文件如下:
--控制文件
[oracle@cancer ~]$ cat ldr_case9.ctl
LOAD DATA
INFILE ldr_case9.dat
DISCARDFILE ldr_case9.dsc
TRUNCATE
INTO TABLE BONUS
WHEN TAB='BON'
(
TAB FILLER POSITION(1:3),
ENAME POSITION(6:10),
JOB POSITION(*+1:20),
SAL POSITION(*+3:27)
)
INTO TABLE MANAGER
WHEN TAB='MGR'
(
TAB FILLER POSITION(1:3),
MGRNO POSITION(6:7),
MNAME POSITION(9:15),
JOB POSITION(*+2:30)
)
虽然这个控制文件看起来比之前的都要复杂,但只有一个新语法,即关键字,我们这里通过WHEN来实现判断,很容易理解。同时,指定了DISCARDFILE参数,以生成不满足加载条件的废弃文件,如果你有心,不妨等执行完sqlldr命令后査看ldr_case9.dsc文件和ldr_case9.log文件。另外注意,控制文件中WHEN逻辑判断不支持OR关键字,因此如果你的判断条件有多个,则只能通过AND连接,而不能直接使用OR。
执行sqlldr命令,并查看结果
--执行sqlldr命令
[oracle@cancer ~]$ sqlldr scott/tiger contro
这篇关于SQL*Loader的使用总结(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!