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(一)的更多相关文章

  1. oracle数据处理之sql loader(三)

    数据装载 sql loader(PPT-I-490-498) 14.1 sql*loader:将外部数据(比如文本型)数据导入oracle database.(用于数据导入.不同类型数据库数据迁移) ...

  2. oracle数据处理之sql*loader(二)

    目录 SQL*Loader对不同文件及格式的处理方法 2.1 Excel文件 一般的Excel文件最大行数不超过65536行,说明数据处理量并不大,处理Excel的方式是将其另存为CSV格式文件,然后 ...

  3. SQL LOADER 的用法 TXT文件导入非常之快

    前提,需要本地安装ORACLE 客户端 控制文件 cms.ctl load dataCHARACTERSET UTF8infile 'oracle.txt'APPEND INTO TABLE JR f ...

  4. 关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法

    在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中2. 建立数据库间的 ...

  5. Oracle【IT实验室】数据库备份与恢复之二:SQL*Loader

    2.1 基本知识 Oracle 的  SQL* LOADER  可以将外部格式化的文本数据加载到数据库表中.通常 与 SPOOL导出文本数据方法配合使用.     1.命令格式 SQLLDR keyw ...

  6. [Oracle] SQL*Loader 详细使用教程(1)- 总览

    SQL*Loader原理   SQL*Loader是Oracle提供的用于数据加载的一种工具,它比较适合业务分析类型数据库(数据仓库),能处理多种格式的平面文件,批量数据装载比传统的数据插入效率更高. ...

  7. [Oracle] SQL*Loader 详细使用教程(2)- 命令行参数

    sqlldr工具   SQL*Loader的客户端工具是sqlldr,在操作系统的命令行下输入sqlldr,后面不接任何参数,将显示帮助信息如下所示(所有命令行参数的简单描述及其默认值),所以你并不需 ...

  8. [Oracle] SQL*Loader 详细使用教程(3)- 控制文件

    控制文件是SQL*Loader里最重要的文件,它是一个文本文件,用来定义数据文件的位置.数据的格式.以及配置数据加载过程的行为,在sqlldr中以control参数指定控制文件.   在控制文件里配置 ...

  9. [Oracle] SQL*Loader 详细使用教程(4)- 字段列表

    在上一篇中我们介绍了SQL*Loader中最重要的文件——控制文件,而本篇要介绍控制文件中最重要的部分——字段列表,字段列表的作用是把数据文件中的记录和数据库中表的列对应起来,下面是字段列表的一个例子 ...

随机推荐

  1. Python参数解析工具ArgumentParser

    通过命令行运行Python脚本时,可以通过ArgumentParser来高效地接受并解析命令行参数. 流程 新建一个ArgumentParser类对象,然后来添加若干个参数选项,最后通过parse_a ...

  2. vue cli 中关于vue.config.js中chainWebpack的配置

    Vue CLI  的官方文档上写:调整webpack配置最简单的方式就是在vue.config.js中的configureWebpack选项提供一个对象. Vue CLI 内部的 webpack 配置 ...

  3. 在K3s上使用Kong网关插件,开启K3s的无限可能!

    我的工作中很重要的一部分是参加各种各样的技术会议.最近参加的是去年11月的北美KubeCon,在会议的最后一天,所有人都焦头烂额,我也一直机械地向不同的人重复我的自我介绍.后来,我已经十分烦躁,决定逃 ...

  4. springboot-遇到的错误

    1.Field userMapper in com.yanan.outjob.controller.SysUserController required a bean of type 'com.yan ...

  5. Jmeter 常用函数(22)- 详解 __intSum

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.htm 作用 计算两个或多个整数值的和 语法格式 ${ ...

  6. chained get value from nested json

    static getValueByKey(o, p, defaultValue = false) { return p.split('.').reduce((r, k) => { if (typ ...

  7. Word Count(C语言)

    1.项目地址 https://github.com/namoyuwen/word-count 2.项目相关要求 2.1 项目描述 Word Count    1. 实现一个简单而完整的软件工具(源程序 ...

  8. Linux MPI环境配置

    参考:https://blog.csdn.net/lusongno1/article/details/61709460 注意点: 1. /etc/profile.d/user.sh和/etc/ld.s ...

  9. 多元线性回归检验t检验(P值),F检验,R方等参数的含义

    做线性回归的时候,检验回归方程和各变量对因变量的解释参数很容易搞混乱,下面对这些参数进行一下说明: 1.t检验:t检验是对单个变量系数的显著性检验   一般看p值:    如果p值小于0.05表示该自 ...

  10. 使用dd命令快速生成大文件或者小文件

    使用dd命令快速生成大文件或者小文件 需求场景: 在程序的测试中有些场景需要大量的小文件或者几个比较大的文件,而在我们的文件系统里一时无法找到那么多或者那么大的文件,此时linux的dd命令就能快速的 ...