oracle数据处理之sql*loader(一)
SQL*Loader是oracle提供的可以从多种平面文件中向数据库中加载数据的工具,它比较适合业务分析类型数据库(数据仓库);使用sqlldr工具可以在很短的时间内向数据库中加载大量的数据,像把制作好的excel表格导入数据库,可以说非常方便,相关的数据加载和卸载工具还有外部表,IMP/EXP,数据泵等,其实,关于SQL*Loader的学习多数时间是花在了琢磨sqlldr控制文件的写法上,下面来总结一下SQL*Loader学习过程和一些实验案例。
一、sqlldr的命令帮助信息
[oracle@wjq ~]$ sqlldr
SQL*Loader: Release
11.2.0.4.0 - Production on Tue Oct 31 11:46:27 2017
Copyright (c) 1982,
2011, Oracle and/or its affiliates.  All rights reserved.
Usage: SQLLDR
keyword=value [,keyword=value,...]
Valid Keywords:
userid -- ORACLE
username/password           #Oracle用户名和口令
control -- control file
name                  #控制文件名
log -- log file
name                      #日志文件名
bad -- bad file
name                      #错误文件名
data -- data file
name                     #数据文件名
discard -- discard file
name                  #废弃文件名
discardmax --
number of discards to allow (Default all)        #允许废弃的全部数目(默认全部)
skip -- number of logical records to skip(Default 0) #要跳过的逻辑记录数目(默认0)
load -- number of logical records to load(Default all) #要加载的逻辑记录数目(默认全部)
errors -- number of errors to allow (Default 50)        
  #允许错误的数目(默认50)
rows -- number of rows in conventional path bind array or between direct path
data saves
(Default: Conventional path 64, Direct path all)#常规路径绑定数组中或直接路径保存数据间的行数 (常规路径默认64,直接路径默认全部)
bindsize --
size of conventional path bind array in bytes  (Default 256000)#常规路径绑定数据的大小(默认256000字节)
silent -- suppress messages during run
(header,feedback,errors,discards,partitions)#运行过程中隐藏的信息(标题,反馈,错误,废弃,分区)
direct -- use direct
path                     
(Default FALSE)#使用直接路径(默认FALSE)
parfile -- parameter file: name of file that contains parameter specifications#参数文件,包括参数说明文件的名称
parallel --
do parallel
load                    
(Default FALSE)#执行并行加载(默认FALSE)
file -- file to allocate extents from #要从以下文件中分配区的文件
skip_unusable_indexes
-- disallow/allow unusable indexes or index partitions  (Default FALSE)#不允许/允许使用无用的索引(默认FALSE)
skip_index_maintenance
-- do not maintain indexes, mark affected indexes as unusable  (Default
FALSE)#不维护索引,对受到影响的索引标记为失效(默认FALSE)
commit_discontinued
-- commit loaded rows when load is discontinued  (Default FALSE)#提交加载中断时已加载的行(默认FALSE)
readsize --
size of read
buffer                 
(Default 1048576)#读取缓冲区的大小(默认1048576字节)
external_table --
use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE  (Default
NOT_USED)#使用外部表进行加载:NOT_USED, GENERATE_ONLY, EXECUTE(默认NOT_USED)
columnarrayrows --
number of rows for direct path column array  (Default 5000)#直接路径列数组的行数(默认5000)
streamsize -- size
of direct path stream buffer in bytes  (Default 256000)#直接路径流缓冲区的大小(默认256000)
multithreading --
use multithreading in direct path  #在直接路径中使用多线程
resumable --
enable or disable resumable for current session  (Default FALSE)#启用或禁用当前可恢复会话(默认FALSE)
resumable_name --
text string to help identify resumable statement#有助于标识可恢复语句的文本字符串
resumable_timeout
-- wait time (in seconds) for RESUMABLE  (Default 7200)#RESUMABLE的等待时间(默认7200秒)
date_cache -- size
(in entries) of date conversion cache  (Default 1000)#日期转换高速缓冲区大小(以条目计)(默认1000条)
no_index_errors --
abort load on any index errors  (Default FALSE)
PLEASE NOTE:
Command-line parameters may be specified either by
position or by
keywords.  An example of the former case is 'sqlldr
scott/tiger foo'; an example of the latter is 'sqlldr control=foo
   userid=scott/tiger'.  One may specify parameters by
position before
but not after
parameters specified by keywords.  For example,
'sqlldr scott/tiger control=foo logfile=log' is allowed, but
'sqlldr scott/tiger
control=foo log' is not, even though the
position of the
parameter 'log' is correct.
注意:
SQLLDR的参数组合比较灵活,即可以直接写值,也可以写关键字=值。例如:sqlldr scott/tiger foo 和 sqlldr control=foo userid=scott/tiger 两种写法均有效。
二、使用案例
1.1简单例子
新建一个wjq_test1.ctl的控制文件,控制文件的名称和文件类型可以任意指定,接着在控制文件中写入内容
SCOTT@seiang11g>create
table tb_loader as select * from bonus;
Table created.
SCOTT@seiang11g>desc
tb_loader
Name  
                     
    Null?    Type
--------------------------------
-------- ------------------------------------
ENAME  
                     
            VARCHAR2(10)
JOB  
                     
              VARCHAR2(9)
SAL  
                     
              NUMBER
COMM  
                     
             NUMBER
控制文件内容如下:
[oracle@wjq
SQL*Loader]$ vim
wjq_test1.ctl
LOAD DATA
INFILE *
INTO TABLE tb_loader
FIELDS TERMINATED BY ","
(ENAME,JOB,SAL)
BEGINDATA
SMITH,CLEAK,3904
ALLEN,SALESMAN,2891  
WARD,SALESMAN,3128
KING,PRESIDENT,2523
执行sqlldr命令
[oracle@wjq
SQL*Loader]$ sqlldr scott/tiger
control=/u01/app/oracle/SQL*Loader/wjq_test1.ctl
SQL*Loader: Release 11.2.0.4.0 - Production on Tue Oct 31 14:43:12 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights
reserved.
Commit point reached - logical record count 4
可以发现提示已经生成了4条数据,接着连接数据库查看一下内容
SCOTT@seiang11g>select
* from tb_loader;
ENAME     
JOB             
SAL       COMM
---------- --------- ---------- ----------
SMITH     
CLEAK           3904
ALLEN     
SALESMAN        2891
WARD       SALESMAN       
3128
KING      
PRESIDENT       2523
发现查询到的内容就是控制文件中BEGINDATA中的数据,数据已经被成功载入。
提示:要插入的表必须在数据库中已经存在,再使用sqlldr向其中加载数据
2、SQL*Loader的体系分析
LOAD DATA
------------------------------------
INFILE *
INTO TABLE
tb_loader
FIELDS TERMINATED
BY ","
(ENAME,JOB,SAL)
BEGINDATA
------------------------------------
SMITH,CLEAK,3904
ALLEN,SALESMAN,2891
WARD,SALESMAN,3128
KING,PRESIDENT,2523
1.2控制文件解析
①第一部分:
LOAD DATA是标准语法,控制文件一般都以此开头,LOAD DATA前还可指定 UNRECOVERABLE或RECOVERABLE来控制此次加载的数据是否可恢复,或者指定CONTINUE_LOAD,表示继续加载,控制文件的其他语句可以查看官方文档。
②中间部分:
*INFILE:表示数据文件位置,如果值为*,表示数据就在控制文件中,本例中没有单独的数据文件,对于大多数加载而言,都会将数据文件与控制文件分离。
*INTO TABLE tbl_name: tbl_name即数据要加载到的目标表,该表在你执行sqlldr命令之前必须已经创建。
*INTO前还有一些很有意思的参数需要说明:
  *INSERT:向表中插入数据,表必须为空,如果表非空的话,执行sqlldr命令时会报错,默认就是INSERT参数。
  *APPEND:向表中追加数据,不管表中是否有数据。
  *REPLACE:替换表中数据,相当于先DELETE表中全部数据,然后再INSERT。
  *TRUNCATE:类似REPLACE,只不过这里不是用DELETE方式删除表中数据,而是通过TRUNCATE的方式删除,然后再INSERT。
*FIELDS TERMINATED BY ",":设置数据部分字符串的分隔值,这里设置为逗
号(,)分隔,当然也可以换成其他任意可见字符,只要确定那是数据行中的分隔符就行。
*(ENAME,JOB,SAL):要插入的表的列名,这里需要注意的是列名要与表中列名完全相同,列的顺序可以与表中列顺序不同,但是必须与数据部分的列一一对应?
*BEGINDATA:表示以下为待加载数据,仅当INFILE指定为*时有效。
③数据部分
在该案例中,是将数据部分与控制部分都放在控制文件中,通常这部分是独立存在于一个文本文件中。如果是独立的数据文件,只需要将控制文件中INFILE参数后面的*改为数据文件的文件名即可。
1.3日志文件解析
在默认情况下,sqlldr命令在执行过程中,会自动产生一个与控制文件同名的日志文件,文件扩展名为.log,日志文件中记录了加载过程中的各项统计信息,如一些初始化参数、读取的记录数、成功加载的记录数、加载用时等。
前例中,执行完sqlldr命令之后,相同路径下应该生成了一个ldr_case1.log文件,直接以“记事本”工具打开查看,应该显示如下内容:
[oracle@wjq
SQL*Loader]$ cat
wjq_test1.log 
SQL*Loader: Release 11.2.0.4.0 - Production on Tue Oct 31 14:43:12 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights
reserved.
Control File:   /u01/app/oracle/SQL*Loader/wjq_test1.ctl
Data File:     
/u01/app/oracle/SQL*Loader/wjq_test1.ctl
  Bad File:    
/u01/app/oracle/SQL*Loader/wjq_test1.bad
  Discard File:  none specified
 
 (Allow all discards)
Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array:     64 rows, maximum of 256000 bytes
Continuation:    none specified
Path used:      Conventional
Table TB_LOADER, loaded from every logical record.
Insert option in effect for this table: INSERT
Column
Name                 
Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
ENAME                              
FIRST     *   ,      
CHARACTER            
JOB                                 
NEXT     *   ,      
CHARACTER            
SAL                                 
NEXT     *   ,      
CHARACTER
Table TB_LOADER:
  4 Rows successfully loaded.
  0 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.
Space allocated for bind
array:                 
49536 bytes(64 rows)
Read   buffer bytes: 1048576
Total logical records skipped:         
0
Total logical records
read:             4
Total logical records rejected:        
0
Total logical records discarded:        0
Run began on Tue Oct 31 14:43:12 2017
Run ended on Tue Oct 31 14:43:12 2017
Elapsed time was:     00:00:00.03
CPU time was:         00:00:00.01
日志文件结构简单,前面都是初始化的参数,中间及后半部分才是我们应该关注的,包括记录的结构、操作的记录数(含成功的和错误的)、花费的时间等,如在这个日志文件中加粗的部分显示己经成功载入了 4条,共费时近40毫秒。
1.4错误文件解析
sqlldr命令在执行过程中,不仅会产生日志文件,如果加载数据过程中由于数据不符合规范导致加载错误,还会产生一个同名的错误文件,文件扩展名为bad(如果DBA不 显式指定的话)。该文件中记录了出错的数据。错误文件中数据的格式与数据文件完全相同,因此如果发现加载时出现错误文件,根据日志文件分析出错原因,解决后修改控制文件中infile参数为错误文件,然后重新执行sqlldr命令即可。
1.5废弃文件解析
除了日志文件和错误文件,执行sqlldr命令时还有可能生成一个同名的废弃文件,文件扩展名为.dsc,在默认情况下不会有,必须在执行sqlldr命令时显式指定废弃文件,并确实存在不符合导入逻辑的记录,里面记录了未被插入的数据
作者:SEian.G(苦练七十二变,笑对八十一难)
oracle数据处理之sql*loader(一)的更多相关文章
- oracle数据处理之sql loader(三)
		数据装载 sql loader(PPT-I-490-498) 14.1 sql*loader:将外部数据(比如文本型)数据导入oracle database.(用于数据导入.不同类型数据库数据迁移) ... 
- oracle数据处理之sql*loader(二)
		目录 SQL*Loader对不同文件及格式的处理方法 2.1 Excel文件 一般的Excel文件最大行数不超过65536行,说明数据处理量并不大,处理Excel的方式是将其另存为CSV格式文件,然后 ... 
- SQL LOADER 的用法 TXT文件导入非常之快
		前提,需要本地安装ORACLE 客户端 控制文件 cms.ctl load dataCHARACTERSET UTF8infile 'oracle.txt'APPEND INTO TABLE JR f ... 
- 关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法
		在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中2. 建立数据库间的 ... 
- Oracle【IT实验室】数据库备份与恢复之二:SQL*Loader
		2.1 基本知识 Oracle 的 SQL* LOADER 可以将外部格式化的文本数据加载到数据库表中.通常 与 SPOOL导出文本数据方法配合使用. 1.命令格式 SQLLDR keyw ... 
- [Oracle] SQL*Loader 详细使用教程(1)- 总览
		SQL*Loader原理 SQL*Loader是Oracle提供的用于数据加载的一种工具,它比较适合业务分析类型数据库(数据仓库),能处理多种格式的平面文件,批量数据装载比传统的数据插入效率更高. ... 
- [Oracle] SQL*Loader 详细使用教程(2)- 命令行参数
		sqlldr工具 SQL*Loader的客户端工具是sqlldr,在操作系统的命令行下输入sqlldr,后面不接任何参数,将显示帮助信息如下所示(所有命令行参数的简单描述及其默认值),所以你并不需 ... 
- [Oracle] SQL*Loader 详细使用教程(3)- 控制文件
		控制文件是SQL*Loader里最重要的文件,它是一个文本文件,用来定义数据文件的位置.数据的格式.以及配置数据加载过程的行为,在sqlldr中以control参数指定控制文件. 在控制文件里配置 ... 
- [Oracle] SQL*Loader 详细使用教程(4)- 字段列表
		在上一篇中我们介绍了SQL*Loader中最重要的文件——控制文件,而本篇要介绍控制文件中最重要的部分——字段列表,字段列表的作用是把数据文件中的记录和数据库中表的列对应起来,下面是字段列表的一个例子 ... 
随机推荐
- DPL,RPL,CPL 之间的联系和区别
			CPL是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位. RPL说明的是进程对段访问的请求权限(Request P ... 
- Caused by: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for
			Caused by: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value f ... 
- 【HNOI2010】弹飞绵羊 - LCT
			题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ... 
- IDEA使用教程(上)
			一.介绍 IDEA全称IntelliJ IDEA,是java语言开发的集成环境.idea提倡的是智能编码,目的是减少程序员的工作,其特色功能有智能的选取.丰富的导航模式.历史记录功能等,最突出的功能 ... 
- python利用爬虫获取百度翻译,爱词霸翻译结果,制作翻译小工具
			先看效果展示(仅作学习使用,非商业) 效果图是采用的 爱词霸 翻译,百度翻译 也实现了,只不过被注释了. 学计算机很多时候碰到生词,每次打开手机/浏览器翻译总觉得很麻烦,就想着自己写一个软件,自己去实 ... 
- async + await 异步
			先执行A在执行B再执行.then里面的AAA() { XXXXX一堆代码 this.BBB().then(()=>{ 其他代码 })}, async BBB(){ let res = await ... 
- JavaScript学习系列博客_20_JavaScript 作用域
			作用域 - 作用域指一个变量的作用的范围 - 在JS中一共有两种作用域 1.全局作用域 - 直接编写在script标签中的JS代码,都在全局作用域- 全局作用域在页面打开时创建,在页面关闭时销毁 - ... 
- Sqlalchemy 事件监听与初始化
			sqlalchemy不仅仅能自动创建数据库,更提供了其他更强大的功能,今天要介绍的就是sqlalchemy中的事件监听,并将其应用到数据库的初始化中. 需求:当插入设置password字段时,自动加密 ... 
- openvswitch 流表操作
			流表组成 每条流表规则由一些列字段组成,可以分为**基础字段.匹配字段和动作字段**三部分. 在打印流表时,在流表中还存在一些显示字段,如duration,idle_age等,此处把这些字段也暂时归之 ... 
- src rpm 下载地址
			drbd: http://mirror.rackspace.com/elrepo/elrepo/el7/SRPMS/ rabbitmq: https://dl.bintray.com/rabbitmq ... 
