使用SQL*Loader高速批量数据加载工具!

1.控制文件中包含要加载的数据

首先创建一张测试表

SQL> show user
USER 为 "ING"
SQL> create table dept
  2  (deptno number(10) constraint dept_pk primary key,
  3   dname varchar2(20),
  4   loc varchar2(20));

表已创建。

然后创建一个控制文件(其中包含被加载的数据)

[oracle@linux sqlldr]$ pwd
/u01/sqlldr
[oracle@linux sqlldr]$ cat demo1.ctl 
LOAD DATA
INFILE *
INTO TABLE DEPT
FIELDS TERMINATED BY ','
(DEPTNO,DNAME,LOC)
BEGINDATA
10,Sales,Virginia
20,Accounting,Virginia
30,Consulting,Virginia
40,Finance,Virginia

然后在命令行执行加载

[oracle@linux sqlldr]$ pwd
/u01/sqlldr
[oracle@linux sqlldr]$ sqlldr userid=ing/ing control=demo1.ctl log=demo1.log

SQL*Loader: Release 10.2.0.4.0 - Production on 星期二 10月 4 18:39:54 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

达到提交点 - 逻辑记录计数 4

查看dept表

SQL> select * from dept;

    DEPTNO DNAME                LOC
---------- -------------------- --------------------
        10 Sales                Virginia
        20 Accounting           Virginia
        30 Consulting           Virginia
        40 Finance              Virginia

查看demo1.log日志文件

[oracle@linux sqlldr]$ pwd
/u01/sqlldr
[oracle@linux sqlldr]$ cat demo1.log 

SQL*Loader: Release 10.2.0.4.0 - Production on 星期二 10月 4 18:39:54 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

控制文件:      demo1.ctl
数据文件:      demo1.ctl
  错误文件:    demo1.bad
  废弃文件:    未作指定
 
(可废弃所有记录)

要加载的数: ALL
要跳过的数: 0
允许的错误: 50
绑定数组: 64 行, 最大 256000 字节
继续:    未作指定
所用路径:       常规

表 DEPT,已加载从每个逻辑记录
插入选项对此表 INSERT 生效

   列名                        位置      长度  中止 包装数据类型
------------------------------ ---------- ----- ---- ---- ---------------------
DEPTNO                              FIRST     *   ,       CHARACTER            
DNAME                                NEXT     *   ,       CHARACTER            
LOC                                  NEXT     *   ,       CHARACTER            


表 DEPT:
  4 行 加载成功。
  由于数据错误, 0 行 没有加载。
  由于所有 WHEN 子句失败, 0 行 没有加载。
  由于所有字段都为空的, 0 行 没有加载。


为绑定数组分配的空间:                 49536 字节 (64 行)
读取   缓冲区字节数: 1048576

跳过的逻辑记录总数:          0
读取的逻辑记录总数:             4
拒绝的逻辑记录总数:          0
废弃的逻辑记录总数:        0

从 星期二 10月 04 18:39:54 2011 开始运行
在 星期二 10月 04 18:39:54 2011 处运行结束

经过时间为: 00: 00: 00.68
CPU 时间为: 00: 00: 00.07


2.控制文件和数据文件分开

继续使用前面的dept表,首先创建一个控制文件和一个数据文件

[oracle@linux sqlldr]$ pwd
/u01/sqlldr
[oracle@linux sqlldr]$ cat demo2.ctl 
load data
infile demo2.data
append into table dept
fields terminated by ','
(deptno,dname,loc)
[oracle@linux sqlldr]$ cat demo2.data 
50,Sales,Virginia
60,Accounting,Virginia
70,Consulting,Virginia
80,Finance,Virginia

然后在命令行执行加载

[oracle@linux sqlldr]$ sqlldr userid=ing/ing control=demo2.ctl 

SQL*Loader: Release 10.2.0.4.0 - Production on 星期二 10月 4 18:47:23 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

达到提交点 - 逻辑记录计数 4

最后查看dept表

SQL> select * from dept;

    DEPTNO DNAME                LOC
---------- -------------------- --------------------
        10 Sales                Virginia
        20 Accounting           Virginia
        30 Consulting           Virginia
        40 Finance              Virginia
        50 Sales                Virginia
        60 Accounting           Virginia
        70 Consulting           Virginia
        80 Finance              Virginia

已选择8行。


3.sql*loader简要说明

注意:下面代码左边加括号的数并不是控制文件的一部分,只是为了方便显示。

(1)LOAD DATA
(2)INFILE *
(3)INTO TABLE DEPT
(4)FIELDS TERMINATED BY ','
(5)(DEPTNO,DNAME,LOC)
(6)BEGINDATA
(7)10,Sales,Virginia
(8)20,Accounting,Virginia
(9)30,Consulting,Virginia
(10)40,Finance,Virginia
(1):这会告诉sqlldr要做什么,上面的例子指示要加载数据。
(2):*是指要加载所有的数据(例子1),也可以直接指定数据文件的名字(例子2)。
(3):这会告诉sqlldr要加载到哪个表中。完整语法:[insert | append | replace | truncate] into table dept     insert - 默认就是insert,后面的dept表必须的空的;append  - 是追加,后面的dept表可以不为空;replace - 是先delete然后在insert;truncate - 是先truncate再insert。
(4):是告诉sqlldr以逗号分隔值。
(5):是告诉sqlldr数据要加载到对应的列中。
(6):是告诉sqlldr要加载的数据开始了。
(7)~(10):是要被加载的具体的数据。

4.常见的一些问题

如何加载特殊字符(引号)

[oracle@linux sqlldr]$ pwd
/u01/sqlldr
[oracle@linux sqlldr]$ cat demo3.ctl 
LOAD DATA
INFILE *
REPLACE INTO TABLE DEPT
FIELDS TERMINATED BY ','OPTIONALLY ENCLOSED BY '"'
(DEPTNO,DNAME,LOC)
BEGINDATA
10,Sales,"Virginia,USA"
20,Accounting,"VS,""USA"""
30,Consulting,Virginia
40,Finance,Virginia
[oracle@linux sqlldr]$ sqlldr ing/ing control=demo3.ctl 

SQL*Loader: Release 10.2.0.4.0 - Production on 星期二 10月 4 19:36:52 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

达到提交点 - 逻辑记录计数 4

查询结果

SQL> select * from dept;

    DEPTNO DNAME                LOC
---------- -------------------- --------------------
        10 Sales                Virginia,USA
        20 Accounting           VS,"USA"
        30 Consulting           Virginia
        40 Finance              Virginia

说明:部门10中的Virginia,USA:这是因为数据是"Virginia,USA"。输入数据字段必须包括在括号里才能保留数据中的逗号。

VS,"USA":这是因为输入数据是"VS,""USA"""。对于括号引起的字符串,两次“记为一次出现。

 

如何加载固定格式数据

[oracle@linux sqlldr]$ pwd
/u01/sqlldr
[oracle@linux sqlldr]$ cat demo4.ctl 
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
(DEPTNO POSITION(1:2),
 DNAME POSITION(3:12),
 LOC POSITION(13:20))
BEGINDATA
10Sales     Virginia
20AccountingVirginia
30ConsultingVirginia
40Finance   Virginia
[oracle@linux sqlldr]$ sqlldr ing/ing control=demo4.ctl 

SQL*Loader: Release 10.2.0.4.0 - Production on 星期二 10月 4 19:45:56 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

达到提交点 - 逻辑记录计数 4

查看

SQL> select * from dept;

    DEPTNO DNAME                LOC
---------- -------------------- --------------------
        10 Sales                Virginia
        20 Accounting           Virginia
        30 Consulting           Virginia
        40 Finance              Virginia

说明:上面控制文件中的(DEPTNO POSITION(1:2), DNAME POSITION(3:12), LOC POSITION(13:20))还可以改为(DEPTNO POSITION(1:2), DNAME POSITION(*:12), LOC POSITION(*:20))效果是一样的。前者是绝对位置,后者是相对位置。

还可以这样写:(DEPTNO POSITION(1:2), DNAME POSITION(*+2:12), LOC POSITION(*+2:20)),只不过这里的*+2对于后面的数据就不太使用了,这里只是给出一个用法展示。


如何使用函数加载数据

[oracle@linux sqlldr]$ pwd
/u01/sqlldr
[oracle@linux sqlldr]$ cat demo5.ctl 
LOAD DATA
INFILE *
REPLACE INTO TABLE DEPT
FIELDS TERMINATED BY ','
(DEPTNO,
 DNAME "UPPER(:DNAME)",
 LOC "UPPER(:LOC)")
BEGINDATA
10,Sales,Virginia
20,Accounting,Virginia
30,Consulting,Virginia
40,Finance,Virginia
[oracle@linux sqlldr]$ sqlldr ing/ing control=demo5.ctl 

SQL*Loader: Release 10.2.0.4.0 - Production on 星期二 10月 4 19:55:25 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

达到提交点 - 逻辑记录计数 4

查看

SQL> select * from dept;

    DEPTNO DNAME                LOC
---------- -------------------- --------------------
        10 SALES                VIRGINIA
        20 ACCOUNTING           VIRGINIA
        30 CONSULTING           VIRGINIA
        40 FINANCE              VIRGINIA

说明:在sql中能做的事情都可以结合到sqlldr脚本中。


如何加载日期

首先修改一下表

SQL> alter table dept add time date;

表已更改。

SQL> desc dept
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 DEPTNO                                    NOT NULL NUMBER(10)
 DNAME                                              VARCHAR2(20)
 LOC                                                VARCHAR2(20)
 TIME                                               DATE

加载

[oracle@linux sqlldr]$ pwd
/u01/sqlldr
[oracle@linux sqlldr]$ cat demo6.ctl 
LOAD DATA
INFILE *
REPLACE INTO TABLE DEPT
FIELDS TERMINATED BY ','
(DEPTNO,
 DNAME,
 LOC,
 TIME DATE 'yyyy-mm-dd')
BEGINDATA
10,Sales,Virginia,2011-10-1
20,Accounting,Virginia,2011-10-10
30,Consulting,Virginia,2011-10-11
40,Finance,Virginia,2011-10-08
[oracle@linux sqlldr]$ sqlldr ing/ing control=demo6.ctl 

SQL*Loader: Release 10.2.0.4.0 - Production on 星期二 10月 4 20:00:25 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

达到提交点 - 逻辑记录计数 4

查询

SQL> select * from dept;

    DEPTNO DNAME                LOC                  TIME
---------- -------------------- -------------------- --------------
        10 Sales                Virginia             01-10月-11
        20 Accounting           Virginia             10-10月-11
        30 Consulting           Virginia             11-10月-11
        40 Finance              Virginia             08-10月-11

说明:后面的日期必须与前面指定的日期格式相对应起来。


如何加载NULL列数据
首先修改一下表

SQL> alter table dept add readme varchar(20);

表已更改。

SQL> desc dept
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 DEPTNO                                    NOT NULL NUMBER(10)
 DNAME                                              VARCHAR2(20)
 LOC                                                VARCHAR2(20)
 TIME                                               DATE
 README                                             VARCHAR2(20)

加载

[oracle@linux sqlldr]$ pwd
/u01/sqlldr
[oracle@linux sqlldr]$ cat demo7.ctl 
LOAD DATA
INFILE *
REPLACE INTO TABLE DEPT
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
 DNAME,
 LOC,
 TIME DATE 'yyyy-mm-dd',
 README)
BEGINDATA
10,Sales,Virginia,2011-10-1
20,Accounting,Virginia,2011-10-10
30,Consulting,Virginia,2011-10-11
40,Finance,Virginia,2011-10-08
[oracle@linux sqlldr]$ sqlldr ing/ing control=demo7.ctl 

SQL*Loader: Release 10.2.0.4.0 - Production on 星期二 10月 4 20:07:55 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

达到提交点 - 逻辑记录计数 4

查询

SQL> select * from dept;

    DEPTNO DNAME                LOC                  TIME           README
---------- -------------------- -------------------- -------------- --------------------
        10 Sales                Virginia             01-10月-11
        20 Accounting           Virginia             10-10月-11
        30 Consulting           Virginia             11-10月-11
        40 Finance              Virginia             08-10月-11
说明:可以看见并没有提供README列的数据,指定TRAILING NULLCOLS关键字,README列就会成为NULL。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值