[Oracle] SQL*Loader 详细使用教程(3)- 控制文件
控制文件是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会自动把数据文件的字符集转换成数据库的字符集,当然前提条件是数据库的字符集是数据文件的字符集的超集。
- 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。
控制文件示例
下面是一个控制文件的例子:
- OPTIONS (DIRECT=true,SKIP_INDEX_MAINTENANCE=true,PARALLEL=true)
- LOAD DATA
- INFILE 'nor.dat'
- BADFILE 'nor.bad'
- DISCARDFILE 'nor.dsc'
- INTO TABLE p95169.DISEASE_EXPERT_RELATION
- APPEND
- WHEN len='3'
- FIELDS TERMINATED BY WHITESPACE
- (
- len FILLER POSITION(1) CHAR,
- DISEASEEXPERTUUID EXPRESSION "SYS_GUID()",
- EXPERTUUID CHAR,
- DISEASEUUID CHAR,
- DISEASESORTCODE EXPRESSION "NULL",
- DISEASENAME CHAR,
- CREATEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')",
- MODIFIEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')"
- )
- INTO TABLE p95169.DISEASE_EXPERT_RELATION
- APPEND
- WHEN len='2'
- FIELDS TERMINATED BY WHITESPACE
- (
- len FILLER POSITION(1) CHAR,
- DISEASEEXPERTUUID EXPRESSION "SYS_GUID()",
- EXPERTUUID CHAR,
- DISEASEUUID EXPRESSION "NULL",
- DISEASESORTCODE EXPRESSION "NULL",
- DISEASENAME CHAR,
- CREATEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')",
- MODIFIEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')"
- )
- INTO TABLE p95169.DISEASE_EXPERT_RELATION
- APPEND
- WHEN len='1'
- FIELDS TERMINATED BY WHITESPACE
- (
- len FILLER POSITION(1) CHAR,
- DISEASEEXPERTUUID EXPRESSION "SYS_GUID()",
- EXPERTUUID CHAR,
- DISEASEUUID EXPRESSION "NULL",
- DISEASESORTCODE EXPRESSION "NULL",
- DISEASENAME EXPRESSION "NULL",
- CREATEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')",
- MODIFIEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')"
- )
[Oracle] SQL*Loader 详细使用教程(4)- 字段列表
- 顶
- 6
- 踩
[Oracle] SQL*Loader 详细使用教程(3)- 控制文件的更多相关文章
- [Oracle] SQL*Loader 详细使用教程(2)- 命令行参数
sqlldr工具 SQL*Loader的客户端工具是sqlldr,在操作系统的命令行下输入sqlldr,后面不接任何参数,将显示帮助信息如下所示(所有命令行参数的简单描述及其默认值),所以你并不需 ...
- [Oracle] SQL*Loader 详细使用教程(1)- 总览
SQL*Loader原理 SQL*Loader是Oracle提供的用于数据加载的一种工具,它比较适合业务分析类型数据库(数据仓库),能处理多种格式的平面文件,批量数据装载比传统的数据插入效率更高. ...
- [Oracle] SQL*Loader 详细使用教程(4)- 字段列表
在上一篇中我们介绍了SQL*Loader中最重要的文件——控制文件,而本篇要介绍控制文件中最重要的部分——字段列表,字段列表的作用是把数据文件中的记录和数据库中表的列对应起来,下面是字段列表的一个例子 ...
- [Oracle] SQL*Loader 详细使用教程(5)- 典型例子
本文介绍SQL*Loader在实际使用过程中经常用到的典型例子. 1. 表中的列比数据文件的列要少怎么办? 假设一个csv的文件如下: a1,a2,a3,a4 b1,b2,b3,b4 c1,c2,c3 ...
- Oracle Sql Loader的学习使用
最近由于遇到oracle控制文件的使用,虽然不是很复杂,但是从来没有用过,专门花点时间看看.点击 这里 查看详细 1,概述: Sql Loader: 一个批量工具,将文件数据导入到数据库.可以导入一个 ...
- [Oracle] Data Pump 详细使用教程(4)- network_link
[Oracle] Data Pump 详细使用教程(1)- 总览 [Oracle] Data Pump 详细使用教程(2)- 总览 [Oracle] Data Pump 详细使用教程(3)- 总览 [ ...
- [Oracle] Data Pump 详细使用教程(5)- 命令交互模式
[Oracle] Data Pump 详细使用教程(1)- 总览 [Oracle] Data Pump 详细使用教程(2)- 总览 [Oracle] Data Pump 详细使用教程(3)- 总览 [ ...
- Oracle SQL Loader
C:/Documents and Settings/WWJD>sqlldr SQL :: Copyright (c) , , Oracle. All rights reserved. 用法: S ...
- oracle之数据同步:Oracle Sql Loader使用说明(大批量快速插入数据库记录)
1.准备表数据 select * from emp10; create sequence seq_eseq increment start maxvalue ; --得到序列的SQL语句 select ...
随机推荐
- 腾迅股票数据接口 http/javascript
腾迅股票数据接口 http/javascript 分类: Finance Perl2012-12-21 23:48 31132人阅读 评论(3) 收藏 举报 之前使用了新浪的股票数据,由于新浪http ...
- 关于Currency类型和 TCurrencyFiled的悲剧
这2天程序出问题, 用户结算金额经常莫名其妙的多出了小数点后几位, 不用思考 肯定是因为浮点精度不准确的问题 查了一下, 程序中的数据类型使用的是Currency, 按照数据类型的描述, 这个金额类型 ...
- python 常用模块 Top200
名次 模块名称 被使用项目数 1 sys 7858 2 os 6983 3 re 5663 4 time 5268 5 random 3339 6 datetime 3310 7 setuptools ...
- zabbix的一些优化参数随笔
StartDBSyncers=12 如果proxy过多 可以适当加大这个参数 ProxyConfigFrequency=60ProxyDataFrequency=60 这两个参数很重要,一个是ser ...
- 微信的redirect_uri参数错误原因分析
我们可以根据微信的开发者文档 http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 网页授权获取用户验证这一章来 ...
- cocos2dx js 3.2 热更新
COCOS IDE用手机调试更新是正常的,是预想的结果,但用COCOS IDE打包发布APK,安装到手机上,热更新下载图片.JSON UI什么的都能正常更新替换,但JS脚本没有替换,这是为毛.更新文件 ...
- Android组件间交互
四大组件相信大家都不陌生了吧,今天咱们就组件间通信做个说明: 首先: 主要今天的目的是为了说明Android 提供的一个ResultReceiver类,这个类相信大家都不陌生吧>?但是你们层深入 ...
- 大数的乘法(C++)
题目:POJ 2398 Bull Math Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13410 Accepted: ...
- AJAX-----16HTML5实现大文件切割上传
2点多接了个电话导致失眠,没办法,跑起来接着板砖了...... 废话不多说,直接走码... <!DOCTYPE html> <html lang="en"> ...
- Azure web role, work role 以及其他role
Azure web role, work role 以及其他role 如果没有创建过web role 和work role的话可以参考如下文章来创建一下web role 和work role. htt ...