PlSql Loader 详细学习

1、SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中。SQL*LOADER是大型数据
仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。


2、在NT下,SQL*LOADER的命令为SQLLDR,在UNIX下一般为sqlldr/sqlload。
如Windows下执行:
C:\Documents and Settings\Administrator>sqlldr

SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 4月 18 11:45:19 2012

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.


3、在Windows下执行:C:\Documents and Settings\Administrator>sqlldr
可以获取如下帮助信息如下,补充了自己的一部分认识:
用法: SQLLDR keyword=value [,keyword=value,...]
有效的关键字:
userid -- ORACLE 用户名/口令:Oracle 的 username/password[@servicename]
control -- 控制文件名
log -- 日志文件名:记录导入时的日志文件,默认为 控制文件(去除扩展名).log
bad -- 错误文件名:坏数据文件,默认为 控制文件(去除扩展名).bad
data -- 数据文件名:数据文件,一般在控制文件中指定。用参数控制文件中不指定数据文件更适于自动操作
discard -- 废弃文件名
discardmax -- 允许废弃的文件的数目 (全部默认)
skip -- 要跳过的逻辑记录的数目 (默认 0)
load -- 要加载的逻辑记录的数目 (全部默认)
errors -- 允许的错误的数目 (默认 50)
rows -- 常规路径绑定数组中或直接路径保存数据间的行数:多少条记录提交一次
(默认: 常规路径 64, 所有直接路径)
bindsize -- 常规路径绑定数组的大小 (以字节计) (默认 256000)
silent -- 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区)
direct -- 使用直接路径 (默认 FALSE)
parfile -- 参数文件: 包含参数说明的文件的名称
parallel -- 执行并行加载 (默认 FALSE)
file -- 要从以下对象中分配区的文件
skip_unusable_indexes -- 不允许/允许使用无用的索引或索引分区 (默认 FALSE)
skip_index_maintenance -- 没有维护索引, 将受到影响的索引标记为无用 (默认 FALSE)

commit_discontinued -- 提交加载中断时已加载的行 (默认 FALSE)
readsize -- 读取缓冲区的大小 (默认 1048576)
external_table -- 使用外部表进行加载; NOT_USED, GENERATE_ONLY, EXECUTE (默认 NOT_USED)
columnarrayrows -- 直接路径列数组的行数 (默认 5000)
streamsize -- 直接路径流缓冲区的大小 (以字节计) (默认 256000)
multithreading -- 在直接路径中使用多线程
resumable -- 启用或禁用当前的可恢复会话 (默认 FALSE)
resumable_name -- 有助于标识可恢复语句的文本字符串
resumable_timeout -- RESUMABLE 的等待时间 (以秒计) (默认 7200)
date_cache -- 日期转换高速缓存的大小 (以条目计) (默认 1000)
no_index_errors -- 出现任何索引错误时中止加载 (默认 FALSE)

PLEASE NOTE: 命令行参数可以由位置或关键字指定。前者的例子是 'sqlldr scott/tiger foo'; 后一种情况的一个示例是 'sqlldr control=foo userid=scott/tiger'。
位置指定参数的时间必须早于但不可迟于由关键字指定的参数。
例如,
允许 'sqlldr scott/tiger control=foo logfile=log',
但是不允许 'sqlldr scott/tiger control=foo log', 即使参数 'log' 的位置正确。


4、sql loader 使用例子
前期描述:
数据将导入的表的表结构如下
create table user_test
(
id VARCHAR2(32) not null,
username VARCHAR2(64),
password VARCHAR2(128),
birthday VARCHAR2(32)
)

数据文件Excel:test.xls

a)、SQL*LOADER 将Excel 数据文件导入到 Oracle数据库指定表中。
(1.创建SQL*Loader 输入数据所需要的文件,均保存到C:\,用记事本编辑:
数据文件:test.txt 是由数据文件test.xls 转换生成的,使用的是制表符为分隔符。

控制文件:input.ctl,内容如下:
  load data           --1、控制文件标识
  infile 'C:\test.txt'     --2、数据源文件名为test.txt
  append into table user_test  --3、向表test中追加记录
  fields terminated by X'09'  --4、字段终止于X'09',是一个制表符(TAB)
  (id,username,password,birthday)   -----定义列对应顺序

其中:
a、insert,为缺省方式,在数据装载开始时要求表为空
b、append,在表中追加新记录
c、replace,删除旧记录,替换成新装载的记录
d、truncate,同上

在DOS窗口下使用SQL*Loader命令实现数据的输入:
C:\>sqlldr userid=用户名/密码@服务名 control=input.ctl
默认日志文件名为:input.log
默认坏记录文件为:input.bad

(2.还有一种方法
可以把Excel文件另存为CSV(逗号分隔)(*.csv),控制文件就改为用逗号分隔
LOAD DATA
INFILE 'C:\test.csv'
APPEND INTO TABLE user_test
FIELDS TERMINATED BY ","
(id,username,password,birthday)


b)、在控制文件中直接导入数据
(1、控制文件test.ctl的内容:
LOAD DATA
INFILE 'C:\test.csv'
INSERT INTO TABLE EMCCOUNTRY
Fields terminated by ";" Optionally enclosed by '"'
(
id,
username,
password NULLIF (CONTINENTID="NULL"),
birthday DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (birthday="NULL")
)
BEGINDATA
"1";"JP";"Japan";"09/16/2004 16:31:32";
"2";"CN";NULL;"09/16/2004 16:31:32";
"3";"IN";"India";NULL;

(2、执行导入命令: C:\>sqlldr userid=用户/密码@服务名 control=test.ctl

如果想去掉字段中含双引号方式,可以改写控制文件,使用如下:
控制文件test.ctl的内容:
LOAD DATA
INFILE 'C:\test.csv'
INSERT INTO TABLE EMCCOUNTRY
Fields terminated by ";" Optionally enclosed by '"'
(
id "substr(:id,2,length(:id)-2)",
username "substr(:username,2,length(:username)-2)",
password "substr(:password,2,length(:password)-2)" NULLIF (CONTINENTID="NULL"),
birthday "substr(:birthday,2,length(:birthday)-2)" DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (birthday="NULL")
)
BEGINDATA
"1";"JP";"Japan";"09/16/2004 16:31:32";
"2";"CN";"NULL";"09/16/2004 16:31:32";
"3";"IN";"India";"NULL";

5、常用技巧
(1、***** 常用的 sqlldr 命令显示的选项
OPTIONS (skip=2,rows=128) -- skip=2 用来跳过数据中的前两行,
load data
infile 'C:\test.csv'
append
into table user_test
Fields terminated by ','
(id,username,password,birthday)

或可以直接在执行命令的时候显示地加入参数:sqlldr 用户名/密码@服务名 input.ctl skip=2


(2、***** 普通装载
LOAD DATA
INFILE *
INTO TABLE user_test
REPLACE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(DEPTNO,
DNAME,
LOC
)
BEGINDATA
10,Sales,"""USA"""
20,Accounting,"Virginia,USA"
30,Consulting,Virginia
40,Finance,Virginia
50,"Finance","",Virginia // loc 列将为空
60,"Finance",,Virginia // loc 列将为空

注意:begindata 后的数值前面不能有空格

(3、***** FIELDS TERMINATED BY WHITESPACE 和 FIELDS TERMINATED BY x'09' 的情况
LOAD DATA
INFILE *
INTO TABLE user_test
REPLACE
FIELDS TERMINATED BY WHITESPACE
-- FIELDS TERMINATED BY x'09'
(id,
username,
password,
birthday
)
BEGINDATA
20 lili 123456a* 19900807


( 4、***** 指定不装载那一列
LOAD DATA
INFILE *
INTO TABLE user_test
REPLACE
FIELDS TERMINATED BY ','
(id,
username,
password FILLER, --下面的 "123456a*" 将不会被装载
birthday
)
BEGINDATA
20,lili,123456a*,19900807


(5、***** 使用函数日期的一种表达 TRAILING NULLCOLS 的使用
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS // 其实下面的ENTIRE_LINE在BEGINDATA后面的数据中是没有直接对应的列的值的。如果第一行改为 10,Sales,Virginia,1/5/2000,, 就不用TRAILING NULLCOLS了
(DEPTNO,
DNAME "upper(:dname)", // 使用函数
LOC "upper(:loc)",
LAST_UPDATED date 'dd/mm/yyyy', // 日期的一种表达方式 还有'dd-mon-yyyy' 等
ENTIRE_LINE ":deptno||:dname||:loc||:last_updated"
)
BEGINDATA
10,Sales,Virginia,1/5/2000
20,Accounting,Virginia,21/6/1999
30,Consulting,Virginia,5/1/2000
40,Finance,Virginia,15/3/2001


( 6、***** 使用自定义的函数,解决的时间问题
create or replace
function my_to_date( p_string in varchar2 ) return date
as
/

LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )" // 使用自定义的函数
)
BEGINDATA
10,Sales,Virginia,01-april-2001
20,Accounting,Virginia,13/04/2001
30,Consulting,Virginia,14/04/2001 12:02:02
40,Finance,Virginia,987268297
50,Finance,Virginia,02-apr-2001


(7、***** 合并多行记录为一行记录
LOAD DATA
INFILE *
concatenate 3 // 通过关键字concatenate 把几行的记录看成一行记录
INTO TABLE DEPT
replace
FIELDS TERMINATED BY ','
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED date 'dd/mm/yyyy'
)
BEGINDATA
10,Sales, // 其实以下3行看成一行 10,Sales,Virginia,1/5/2000
Virginia,
1/5/2000

(8、***** 载入有换行符的数据
注意: unix 和 windows 不同 & /n
< 1 > 使用一个非换行符的字符
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS "replace(:comments,'n',chr(10))" // replace 的使用帮助转换换行符
)
BEGINDATA
10,Sales,Virginia,01-april-2001,This is the SalesnOffice in Virginia
20,Accounting,Virginia,13/04/2001,This is the AccountingnOffice in Virginia
30,Consulting,Virginia,14/04/2001 12:02:02,This is the ConsultingnOffice in Virginia
40,Finance,Virginia,987268297,This is the FinancenOffice in Virginia

< 2 > 使用fix属性
LOAD DATA
INFILE demo17.dat "fix 101"
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS
)
demo17.dat
10,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia
20,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia
40,Finance,Virginia,987268297,This is the Finance
Office in Virginia

// 这样装载会把换行符装入数据库 下面的方法就不会 但要求数据的格式不同

LOAD DATA
INFILE demo18.dat "fix 101"
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS
)
demo18.dat
10,Sales,Virginia,01-april-2001,"This is the Sales
Office in Virginia"
20,Accounting,Virginia,13/04/2001,"This is the Accounting
Office in Virginia"
30,Consulting,Virginia,14/04/2001 12:02:02,"This is the Consulting
Office in Virginia"
40,Finance,Virginia,987268297,"This is the Finance
Office in Virginia"

< 3 > 使用var属性
LOAD DATA
INFILE demo19.dat "var 3"
// 3 告诉每个记录的前3个字节表示记录的长度 如第一个记录的 071 表示此记录有 71 个字节
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS
)
demo19.dat
07110,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia
07820,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia
08730,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia
07140,Finance,Virginia,987268297,This is the Finance
Office in Virginia

< 4 > 使用str属性
最灵活的一种可定义一个新的行结尾符 win 回车换行 : chr(13)||chr(10)
此列中记录是以 a|rn 结束的
select utl_raw.cast_to_raw('|'||chr(13)||chr(10)) from dual;
结果 7C0D0A

LOAD DATA
INFILE demo20.dat "str X'7C0D0A'"
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS
)

demo20.dat
10,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia|
20,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia|
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia|
40,Finance,Virginia,987268297,This is the Finance
Office in Virginia|

==============================================================================

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值