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

 

在控制文件里配置命令行参数 (OPTIONS)

在上一篇中我们讲过命令行参数可以配置在三个地方,其中一个就是可以使用控制文件的OPTIONS字句(这也是最常用的方式),如下所示:

OPTIONS (DIRECT=true, SILENT=(ERRORS, FEEDBACK) )

更多的命令行参数,请见上一篇。

 

配置数据文件(INFILE)

使用INFILE可以配置一个或多个数据文件,其语法如下:

如果数据包含在控制文件本身,则用*表示,如:

INFILE  *

在控制文件的末尾,以BEGINDATA开头,后面接数据:

BEGINDATA
data

如果你有多个数据文件怎么办?很简单,只要多个INFILE即可,而且还可以为每个INFILE指定各自的错误文件和丢弃文件等,如下所示:

INFILE  mydat1.dat  BADFILE  mydat1.bad  DISCARDFILE mydat1.dis
INFILE mydat2.dat
INFILE mydat3.dat DISCARDFILE mydat3.dis
INFILE mydat4.dat DISCARDMAX 10 0

字符集

如果数据文件的字符集和数据库的字符集不一样,SQL*Loader会自动把数据文件的字符集转换成数据库的字符集,当然前提条件是数据库的字符集是数据文件的字符集的超集。

数据库的字符集可以通过以下SQL语句查询:
  1. select * from nls_database_parameters;

数据文件的字符集可以通过控制文件中的CHARACTERSET参数配置,其语法如下:

CHARACTERSET char_set_name 

如果没有设置CHARACTERSET参数,数据文件的字符集由操作系统的NLS_LANG设置。
受到字符集影响的数据类型有:CHAR,VARCHAR,numeric EXTERNAL, datetime, interval

还有一种字符集要特别注意,就是控制文件本身的字符集(只能由NLS_LANG设置),如果控制文件的字符集和数据文件的不一样,会先转换成数据文件的字符集,但这样很容易出错(特别是分隔符),因此,实际使用中为了方便,一般把NLS_LANG,CHARACTERSET(如果有的话)设成和数据库字符集一样。

数据加载方式(INSERT, APPEND, REPLACE, TRUNCATE)

默认情况下,SQL*Loader是以INSERT方式加载数据,目标表必须是空表,否则会报错;

如果目标表为非空表,则必须指定如下的三种方式之一:

1. APPEND:添加数据至源数据的后面

2. REPLACE:在添加数据之前,先执行DELETE FROM TABLE把表清空,注意:这里的REPLACE是表级别的替代,而不是行级别

3. TRUNCATE:在添加数据之前,先执行TRUNCATE TABLE table_name REUSE STORAGE

从上面我们可以知道,SQL*Loader不支持对已存在的行更新,如果你想更新已存在的行,则必须先把数据加载至一个空的中间表,然后在原表和中间表进行关联update

如果你想把记录插入到多个表中,可以使用多个INTO TABLE,举个例子:

1 50   Manufacturing       — DEPT record
2 1119 Smith 50 — EMP record
2 1120 Snyder 50
1 60 Shipping
2 1121 Stevens 60
数据文件如上所示,根据第一列的值插入到不同的表中:
INTO TABLE dept
WHEN recid = 1
(recid FILLER POSITION(1:1) INTEGER EXTERNAL,
deptno POSITION(3:4) INTEGER EXTERNAL,
dname POSITION(8:21) CHAR)
INTO TABLE emp
WHEN recid <> 1
(recid FILLER POSITION(1:1) INTEGER EXTERNAL,
empno POSITION(3:6) INTEGER EXTERNAL,
ename POSITION(8:17) CHAR,
deptno POSITION(19:20) INTEGER EXTERNAL)

数据过滤(WHEN)

我们可以用WHEN字句筛选需要的记录,不符合WHEN条件的记录将被丢弃,WEHN的语法如下:

下面是一个例子:
WHEN (deptno = '10') AND (job = 'SALES') 

 

设置字段分隔符(WHEN)

如果所有的字段分隔符都一样,可以设置一个默认的分隔符,其语法如下:


下面是一个例子:

FIELDS TERMINATED BY WHITESPACE
 

无法匹配的字段用NULL填充(TRAILING NULLCOLS)

如果数据文件中记录的列少于目标表的列,最好用NULL代替,否则会报错,如下所示:

INTO TABLE dept
TRAILING NULLCOLS
( deptno CHAR TERMINATED BY " ",
dname CHAR TERMINATED BY WHITESPACE,
loc CHAR TERMINATED BY WHITESPACE
)

记录格式如下:

10 Accounting 

对于如上的这条记录,loc列的值为NULL。

控制文件示例

下面是一个控制文件的例子:

  1. OPTIONS (DIRECT=true,SKIP_INDEX_MAINTENANCE=true,PARALLEL=true)
  2. LOAD DATA
  3. INFILE 'nor.dat'
  4. BADFILE 'nor.bad'
  5. DISCARDFILE 'nor.dsc'
  6. INTO TABLE p95169.DISEASE_EXPERT_RELATION
  7. APPEND
  8. WHEN len='3'
  9. FIELDS TERMINATED BY WHITESPACE
  10. (
  11. len FILLER POSITION(1) CHAR,
  12. DISEASEEXPERTUUID EXPRESSION "SYS_GUID()",
  13. EXPERTUUID CHAR,
  14. DISEASEUUID CHAR,
  15. DISEASESORTCODE EXPRESSION "NULL",
  16. DISEASENAME CHAR,
  17. CREATEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')",
  18. MODIFIEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')"
  19. )
  20. INTO TABLE p95169.DISEASE_EXPERT_RELATION
  21. APPEND
  22. WHEN len='2'
  23. FIELDS TERMINATED BY WHITESPACE
  24. (
  25. len FILLER POSITION(1) CHAR,
  26. DISEASEEXPERTUUID EXPRESSION "SYS_GUID()",
  27. EXPERTUUID CHAR,
  28. DISEASEUUID EXPRESSION "NULL",
  29. DISEASESORTCODE EXPRESSION "NULL",
  30. DISEASENAME CHAR,
  31. CREATEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')",
  32. MODIFIEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')"
  33. )
  34. INTO TABLE p95169.DISEASE_EXPERT_RELATION
  35. APPEND
  36. WHEN len='1'
  37. FIELDS TERMINATED BY WHITESPACE
  38. (
  39. len FILLER POSITION(1) CHAR,
  40. DISEASEEXPERTUUID EXPRESSION "SYS_GUID()",
  41. EXPERTUUID CHAR,
  42. DISEASEUUID EXPRESSION "NULL",
  43. DISEASESORTCODE EXPRESSION "NULL",
  44. DISEASENAME EXPRESSION "NULL",
  45. CREATEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')",
  46. MODIFIEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')"
  47. )
 

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

 
 
6

[Oracle] SQL*Loader 详细使用教程(3)- 控制文件的更多相关文章

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

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

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

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

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

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

  4. [Oracle] SQL*Loader 详细使用教程(5)- 典型例子

    本文介绍SQL*Loader在实际使用过程中经常用到的典型例子. 1. 表中的列比数据文件的列要少怎么办? 假设一个csv的文件如下: a1,a2,a3,a4 b1,b2,b3,b4 c1,c2,c3 ...

  5. Oracle Sql Loader的学习使用

    最近由于遇到oracle控制文件的使用,虽然不是很复杂,但是从来没有用过,专门花点时间看看.点击 这里 查看详细 1,概述: Sql Loader: 一个批量工具,将文件数据导入到数据库.可以导入一个 ...

  6. [Oracle] Data Pump 详细使用教程(4)- network_link

    [Oracle] Data Pump 详细使用教程(1)- 总览 [Oracle] Data Pump 详细使用教程(2)- 总览 [Oracle] Data Pump 详细使用教程(3)- 总览 [ ...

  7. [Oracle] Data Pump 详细使用教程(5)- 命令交互模式

    [Oracle] Data Pump 详细使用教程(1)- 总览 [Oracle] Data Pump 详细使用教程(2)- 总览 [Oracle] Data Pump 详细使用教程(3)- 总览 [ ...

  8. Oracle SQL Loader

    C:/Documents and Settings/WWJD>sqlldr SQL :: Copyright (c) , , Oracle. All rights reserved. 用法: S ...

  9. oracle之数据同步:Oracle Sql Loader使用说明(大批量快速插入数据库记录)

    1.准备表数据 select * from emp10; create sequence seq_eseq increment start maxvalue ; --得到序列的SQL语句 select ...

随机推荐

  1. Java Basic - Encapsulation

    *** 封装 *** 面向对象特征 - 封装 封装的基本原则 将你的实例变量标记为私有的,比如提供公有的get与set方法来控制存取动作 有些get和set 可能什么事情也没做, 只是把值设给变量而已 ...

  2. kali 密码攻击

    第八章 密码攻击 作者:Willie L. Pritchett, David De Smet 译者:飞龙 协议:CC BY-NC-SA 4.0 这一章中,我们要探索一些攻击密码来获得用户账户的方式.密 ...

  3. git pull all braches

    控制台下执行如下: git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote ...

  4. iOS: 上传App到AppStore,由于Xcode上传太慢,换成Application Loader上传,速度秒传

    一.遇到的遭遇 在之前的项目开发中,本人有点固执,一直采用xcode打包后再上传,结果可想而知: (1)要么上传时速度慢的跟蜗牛似的,等的我心力交瘁(不排除网络不给力的原因,公司这个吊问题快把我气疯了 ...

  5. Oracle中的rownum和rowid

    http://blog.csdn.net/mitedu/article/details/3584399  rownum http://blog.csdn.net/mitedu/article/deta ...

  6. Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形) .

    1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, ...

  7. in-list expansion

    in-list expansion也被称作or expansion --针对in后面是常量集合的另外一种处理方法.优化器会把目标sql中in后面的常量集合拆开,把里面的每个常量都提出来形成一个分支,各 ...

  8. Latex 学习

    Latex 学习 @(05.2 Latex)[latex][基础教程] 这篇文章是关于latex基础教程.pdf的一个总结. 基本知识 基础 1. 空格 多个空格会被视为一个空格 单个回车会被视为一个 ...

  9. (九)串行口方式0 拓展并行输入端口 74LS165 芯片

    74LS165芯片讲解: 外接一个同步移位寄存器 74LS165芯片,拓展一个 8 位 并行输入端口的电路, 可将接在74LS165芯片的8个开关 S0——S7 的状态 通过 串行口方式 0 读到 单 ...

  10. JS数组定义【收藏】

    最近在学习JS,刚好学到数组,发现章节还蛮多了而且发现了数组的以前好多不知道的东西,顺便整理下: 数组一共有有四种定义的方式 使用构造函数: var a = new Array(); var b = ...