这个工具可以批量导入数据,具体使用方法如下:
用法: SQLLDR keyword=value [,keyword=value,...]
有效的关键字:
userid -- ORACLE 用户名/口令
control -- 控制文件名
log -- 日志文件名
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)
(
7.4 直接加载和 SQL*LOADER
在 SQL*LOADER 中也可以使用直接加载,它比传统方式效率更高,因为它绕开了 SQL 的解析和数据缓冲区,直接将数据加载到数据文件,这对 OLAP 或者数据仓库系统非常有用。
指定加载:
Sqlldr userid=user/pwd control=control.ctl direct=true
指定并行和加载:
Sqlldr userid=user/pwd control=control.ctl direct=true parallel=true
SQL*LOADER 直接加载对索引的影响:
( 1 )索引为非约束性,直接加载可以在加载完毕后维护索引的完整性。
( 2 )索引为约束性索引,比如主键,直接加载仍然会将数据加载入库,但是会将索引置为 unusable.
如果使用 SQL*LOADER 的并行直接加载选项,并且表上有索引,将导致加载失败,这是我们可以在 sqlloader 中指定 skip_index_maintenance=true, 来允许加载完成,但是索引状态会变成 unusable ,需要手工 rebuild.
)
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)
PLEASE NOTE: 命令行参数可以由位置或关键字指定
。前者的例子是 'sqlload
scott/tiger foo'; 后一种情况的一个示例是 'sqlldr control=foo
userid=scott/tiger'.位置指定参数的时间必须早于
但不可迟于由关键字指定的参数。例如,
允许 'sqlldr scott/tiger control=foo logfile=log', 但是
不允许 'sqlldr scott/tiger control=foo log', 即使
参数 'log' 的位置正确。
下面以txt文件为例:
file.txt里包含了要导入的数据内容,file.ctl是控制文件其内容如下:
[oracle@oracle d]$ cat file.ctl
load data //导入数据
infile 'file.txt' //数据所在的文件名
append into table test2 //要导入到那个表
fields terminated by ',' //指出数据文件每个记录之间的分隔符
hostname,
ip,
type,
mem,
cpu,
disk //字段名称
)
只要有这两个文件就够了,下面是个简单的脚本:
运行此脚本后会在当前目录下生成一个file.log的日志文件,如果有错误存在可以查看日志文件进行排错,如下所示:
[oracle@oracle d]$ cat file.log
SQL*Loader: Release 10.2.0.4.0 - Production on 星期五 7月 16 11:12:52 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
控制文件: /home/oracle/d/file.ctl
数据文件: ././file.txt
错误文件: /home/oracle/d/file.bad
废弃文件: 未作指定
(可废弃所有记录)
要加载的数: ALL
要跳过的数: 0
允许的错误: 50
绑定数组: 64 行, 最大 256000 字节
继续: 未作指定
所用路径: 常规
表 TEST2,已加载从每个逻辑记录
插入选项对此表 APPEND 生效
列名 位置 长度 中止 包装数据类型
------------------------------ ---------- ----- ---- ---- ---------------------
HOSTNAME FIRST * , CHARACTER
IP NEXT * , CHARACTER
TYPE NEXT * , CHARACTER
MEM NEXT * , CHARACTER
CPU NEXT * , CHARACTER
DISK NEXT * , CHARACTER
表 TEST2:
49 行 加载成功。
由于数据错误, 0 行 没有加载。
由于所有 WHEN 子句失败, 0 行 没有加载。
由于所有字段都为空的, 0 行 没有加载。
为绑定数组分配的空间: 99072 字节 (64 行)
读取 缓冲区字节数: 1048576
跳过的逻辑记录总数: 0
读取的逻辑记录总数: 49
拒绝的逻辑记录总数: 0
废弃的逻辑记录总数: 0
从 星期五 7月 16 11:12:52 2010 开始运行
在 星期五 7月 16 11:12:52 2010 处运行结束
经过时间为: 00: 00: 00.17
CPU 时间为: 00: 00: 00.05
以下是非常不错的文献:
http://linjianqing.javaeye.com/blog/501563
http://www.blogjava.net/Unmi/archive/2009/01/05/249956.html