ITPub博客

首页 > 数据库 > Oracle > sqlldr的学习与总结

sqlldr的学习与总结

原创 Oracle 作者:静以致远√团团 时间:2013-11-19 11:32:51 0 删除 编辑
######################################      sqlldr数据加载工具的学习总结   




sqlldr是oracle7以来一直比较流行的数据加载工具,使用方便,灵活,在windows界面下是SQLLDR,linux/unix 平台大小写敏感,是sqlldr


有关sqlldr的五个文件:
1.控制文件:顾名思义该文件负责控制加载数据的关键信息,其中重要参数如下:
  LOAD DATA 控制文件一般都是以此开头,用来表示加载数据,默认的不用加任何参数,参数主要有UNRECOVER和RECOVER用来控制所加载数据是否可以恢复,也可以为CONTINUE_LOAD表示继续加载
  INFILE 表示要加载的数据文件的位置,若为*表示该数据文件写在该控制文件内部
  INTO TABLE 表示要加载数据的目标表,加载方式有以下几种:
INSERT INTO 向表中插入数据,该方式表必须为空表
APPEND INTO 向表中追加数据
REPLACE INTO 替换表中的数据,等于将表的数据delete后再向表中添加数据
TRUNCATE INTO 以truncate的方式将表中的数据清空后加载数据
  FIELDS TERMINATED BY "," 指定加载数据的分隔值,此处认为是,分割
  (NAME,SEX,AGE)要加入的表中的列名
  BEGINDATA 表示以下是要加载的数据,INFILE为*时参数才用得到
2.数据文件
  数据文件为要加载的数据存储文件,格式不统一
3.日志文件
  默认情况下加载数据完成后会在控制文件同目录下生成一个扩展名为.log的日志文件,用来记录数据加载情况
4.错误文件
  在sqlldr加载数据时遇到加载错误的数据,会把加载错误的数据写入同名下扩展名为.bad的错误文件中。该参数可以自行修改
5.废弃文件
  如果有需求,可以显示的制定废弃数据(不需要加载的数据)写入到一个扩展名为.dsc的废弃文件中,该文件需要特殊制定,默认情况下不会产生




一个简单的sqlldr的控制文件:
[oracle@orcl2 myscript]$ pwd
/u01/myscript


在/u01/myscript下做sqlldr的练习,写入sqlldr1.ctl如下内容


LOAD DATA  


INFILE *   //为*说明我要加载的数据就在该控制文件内
INTO TABLE BONUS //将数据加载到bouns表中
FIELDS TERMINATED BY "," //分割符用的是,
(ENAME,JOB,SAL) //制定要加载到表中的列名


BEGINDATA //以下部分为要加载的数据
TOM,EMP,100
LALY,EMP,110
TOKE,EMP,120
JONE,EMP,130
JECL,MGR,140
JECK,HR,150
KULI,MGR,160


以scott用户创建bonus表结构
SQL> conn scott/oracle
Connected.
SQL> create table bonus(ENAME varchar(20),JOB varchar(15),SAL number);


Table created.


开始加载数据:
[oracle@orcl2 myscript]$ sqlldr scott/oracle control=sqlldr1.ctl


SQL*Loader: Release 10.2.0.1.0 - Production on Tue Nov 19 10:21:58 2013


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


Commit point reached - logical record count 8


数据加载完毕,查看通目录下的文件:
[oracle@orcl2 myscript]$ ls
sqlldr1.ctl  sqlldr1.log
发现多出了一个.log文件,没有.bad文件和.dsc文件说明此次加载数据无任何的错误


在scott用户下查看表中的数据信息
SQL> select * from bonus;


ENAME                JOB                    SAL
-------------------- --------------- ----------
TOM                  EMP                    100
LALY                 EMP                    110
TOKE                 EMP                    120
JONE                 EMP                    130
JECL                 MGR                    140
JECK                 HR                     150
KULI                 MGR                    160


7 rows selected.
发现7条数据已完全加载如表中




从excel表中向数据库导入数据:


拿到一个excel表格,首先复制一份表格出来,以下操作均在备份表格中,以防原数据损坏


得到复制excel表格后,将其列头和无关数据删除后,点击文件->另存为->保存类型选择csv(次格式的表格可以用记事本打开,数据间用的是逗号分隔符),以记事本打开刚保存的csv的表格即得到你要的数据,此处我所得到的测试数据如下:
USER1,EMP,100
USER2,EMP,101
USER3,EMP,102
USER4,EMP,103
USER5,EMP,104
USER6,EMP,105
USER7,MGR,106
USER8,MGR,107
USER9,HR,108


编辑名为sqlldr2.ctl的控制文件:
LOAD DATA
INFILE sqlldr2.dat       //指定加载的数据文件路径
APPEND INTO TABLE BONUS
FIELDS TERMINATED BY ","
(ENAME,JOB,SAL)
注:若要加载数据中含有自己指定的分隔符,可以在FIELDS TERMINATED BY ","后加上OPTIONALLY ENCLOSED BY '"'指定"为定界符
图目录下编辑名为sqlldr2.dat的数据文件,加入刚才得到的逗号分隔符的数据
USER1,EMP,100
USER2,EMP,101
USER3,EMP,102
USER4,EMP,103
USER5,EMP,104
USER6,EMP,105
USER7,MGR,106
USER8,MGR,107
USER9,HR,108
开始加载数据:
[oracle@orcl2 sqlldr2]$ sqlldr scott/oracle control=sqlldr2.ctl 


SQL*Loader: Release 10.2.0.1.0 - Production on Tue Nov 19 10:45:40 2013


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


Commit point reached - logical record count 9
查看表中数据是否添加成功
SQL> select * from bonus;


ENAME                JOB                    SAL
-------------------- --------------- ----------
TOM                  EMP                    100
LALY                 EMP                    110
TOKE                 EMP                    120
JONE                 EMP                    130
JECL                 MGR                    140
JECK                 HR                     150
KULI                 MGR                    160
USER1                EMP                    100
USER2                EMP                    101
USER3                EMP                    102
USER4                EMP                    103


ENAME                JOB                    SAL
-------------------- --------------- ----------
USER5                EMP                    104
USER6                EMP                    105
USER7                MGR                    106
USER8                MGR                    107
USER9                HR                     108


16 rows selected.


加载无分隔符的数据


导出测试数据
SQL> set linesize 60
SQL> set feedback off
SQL> set heading off
SQL> spool /u01/myscript/sqlldr3/sqlldr3.dat
SQL> select * from bonus;
TOM                  EMP                    100
LALY                 EMP                    110
TOKE                 EMP                    120
JONE                 EMP                    130
JECL                 MGR                    140
JECK                 HR                     150
KULI                 MGR                    160
USER1                EMP                    100
USER2                EMP                    101
USER3                EMP                    102
USER4                EMP                    103
USER5                EMP                    104
USER6                EMP                    105
USER7                MGR                    106
USER8                MGR                    107
USER9                HR                     108
SQL> spool off
SQL> set heading on
SQL> set feedback on


查看导出结果
[oracle@orcl2 sqlldr3]$ cat sqlldr3.dat 
SQL> select * from bonus;
TOM                  EMP                    100             
LALY                 EMP                    110             
TOKE                 EMP                    120             
JONE                 EMP                    130             
JECL                 MGR                    140             
JECK                 HR                     150             
KULI                 MGR                    160             
USER1                EMP                    100             
USER2                EMP                    101             
USER3                EMP                    102             
USER4                EMP                    103             
USER5                EMP                    104             
USER6                EMP                    105             
USER7                MGR                    106             
USER8                MGR                    107             
USER9                HR                     108       
将首行的SQL语句删除 
将原表中的数据删除
SQL> truncate table bonus;


Table truncated.


SQL> select * from bonus;


no rows selected


编写控制文件sqlldr3.ctl内容如下:
LOAD DATA
INFILE sqlldr3.dat
TRUNCATE INTO TABLE BONUS
(
ENAME POSITION(1:15),     //指定截取从第一个字符开始到第十五个结束,其间的字符作为ENAME加载到数据库,下同
JOB POSITION(22:40),
SAL POSITION(44:60)
)
导入数据:
[oracle@orcl2 sqlldr3]$ sqlldr scott/oracle control=sqlldr3.ctl 


SQL*Loader: Release 10.2.0.1.0 - Production on Tue Nov 19 11:27:22 2013


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


Commit point reached - logical record count 16
[oracle@orcl2 sqlldr3]$ ls
sqlldr3.ctl  sqlldr3.dat  sqlldr3.log


查看数据导入情况


SQL> select * from bonus;


ENAME                JOB                    SAL
-------------------- --------------- ----------
TOM                  EMP                    100
LALY                 EMP                    110
TOKE                 EMP                    120
JONE                 EMP                    130
JECL                 MGR                    140
JECK                 HR                     150
KULI                 MGR                    160
USER1                EMP                    100
USER2                EMP                    101
USER3                EMP                    102
USER4                EMP                    103


ENAME                JOB                    SAL
-------------------- --------------- ----------
USER5                EMP                    104
USER6                EMP                    105
USER7                MGR                    106
USER8                MGR                    107
USER9                HR                     108


16 rows selected.




16行数据完全导入成功!


未完待续。。。








来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29320885/viewspace-776950/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
每个人都有梦想,去实现吧!

注册时间:2013-11-14

  • 博文量
    164
  • 访问量
    2103651