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. 洛谷P1036.选数(DFS)

    题目描述 已知 n个整数 x1,x2,-,xn,以及11个整数k(k<n).从n个整数中任选k个整数相加,可分别得到一系列的和.例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部 ...

  2. noip复习——线性筛(欧拉筛)

    整数的唯一分解定理: \(\forall A\in \mathbb {N} ,\,A>1\quad \exists \prod\limits _{i=1}^{s}p_{i}^{a_{i}}=A\ ...

  3. vue watch 和 computed 区别与使用

    目录 computed 和 watch 的说明 与 区别 computed 计算属性说明: watch 监听属性说明: watch 和 computed 的区别是: 使用 参考官方文档 compute ...

  4. C++ Templates (Part I 基本概念 The Basics)

    C++ 模板 (C++ Templates) 目录 C++ 模板 (C++ Templates) 第一部分 基本概念 (The Basics) 第一部分章节目录 参考资料 第一部分 基本概念 (The ...

  5. Spring Boot 如何解决项目启动时初始化资源

    在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初始化资 ...

  6. [源码解析] Flink的Slot究竟是什么?(1)

    [源码解析] Flink的Slot究竟是什么?(1) 目录 [源码解析] Flink的Slot究竟是什么?(1) 0x00 摘要 0x01 概述 & 问题 1.1 Fllink工作原理 1.2 ...

  7. Redis秒杀系统架构设计-微信抢红包

    导读 前二天我写了一篇,Redis高级项目实战(点我直达),SpringBoot整合Redis附源码(点我直达),今天我们来做一下Redis秒杀系统的设计.当然啦,Redis基础知识还不过关的,先去加 ...

  8. 开始System.out.println();

    第一篇博客 我在逛别人的博客的时候,发现他们有些内容是写他们自己的人生,有些是关于技术方面的个人观点分享探讨,每当看到好的文章的时候,我已经习惯的去点击收藏.有的时候我也在想,我为什么就不能做一个输出 ...

  9. js对象数组新增、修改时的验证是否重复的逻辑

    JS代码: // 定义数据集合 const persons = [ { id: 1, name: '张三' }, { id: 2, name: '李四' } ] console.log('') con ...

  10. IDEA run/debug configurations中没有配置tomcat选项

    原文链接:https://blog.csdn.net/qq_41016818/article/details/80871738 原因分析 没有配置tomcat插件 解决方法如下: file->s ...