SqlLoader 为oracle自带工具,不需要另外安装
创建文件control.ctl 和导入csv文件放到同一个目录下
OPTIONS(SKIP=1) --跳过第一行
LOAD DATA --1、控制文件标识
INFILE 'D:\SQL_TEMP\tmp001.csv' --2、要输入的数据文件名为'D:\SQL_TEMP\tmp001.csv'
APPEND INTO TABLE it_frs_shopstock_0_bak --3、向表it_frs_shopstock_0_bak 中追加记录
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' --4、用','分割
(SDATE date "YYYY-MM-DD HH24:MI:SS",SHOPID char,GOODSID char,CURSTOCKQTY) -----定义列对应顺序 (注意日期格式要和csv中的文档格式相同)
参数:
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)
commit_discontinued--提交加载中断时已加载的行 (默认 FALSE)
readsize -- 读取缓冲区的大小 (默认 1048576)
external_table -- 使用外部表进行加载; NOT_USED, GENERATE_ONLY,EXECUTE (默认 NO
T_USED)
columnarrayrows -- 直接路径列数组的行数 (默认 5000)
streamsize -- 直接路径流缓冲区的大小 (以字节计) (默认 256000)
multithreading -- 在直接路径中使用多线程
resumable -- 启用或禁用当前的可恢复会话 (默认 FALSE)
resumable_name -- 有助于标识可恢复语句的文本字符串
resumable_timeout -- RESUMABLE 的等待时间 (以秒计) (默认 7200)
date_cache -- 日期转换高速缓存的大小 (以条目计) (默认 1000)
no_index_errors -- 出现任何索引错误时中止加载 (默认 FALSE)
cmd执行命令
sqlldr userid=sdbmgr/sdbmgr@crv_frssit_dev control=control.ctl
linux执行命令
sqlldr userid=sdbmgr/sdbmgr control=control1.ctl direct=true parallel=true
增加导入效率的方法:
注:
1、当加载大量数据时(大约超过10GB),最好抑制日志的产生:
ALTER TABLE table_name nologging;这样不产生REDOLOG,可以提高效率。
2.direct :使用直接路径 (注意:如果此参数指定为true,导入表中不能有check,referential约束和触发器,所以可以先删掉表中check)
3.parallel:打开并行
如果导入出现问题可查自动生成的日志文件.
如下为一个脚本,可供参考
此脚本可生成ctl控制文件和一个运行shell脚本文件
可以实现多文件导入一个表.(注意:使用了direct参数,如果表存在索引,约束,触发器,需要去掉此参数)
#!/bin/sh #!/bin/bash i=0 runfile=/home/oracle/sales/run.sh if [ -f control*.ctl ]; then rm control*.ctl fi; if [ -f control*.log ]; then rm control*.log fi; if [ -f ${runfile} ]; then rm $runfile fi touch $runfile for file in `ls 促销*txt` do echo $file i=$(($i+1)) echo 'OPTIONS(SKIP=0)' >control$i.ctl echo 'LOAD DATA' >>control$i.ctl echo "INFILE '$file'" >>control$i.ctl echo "APPEND INTO TABLE SDBMGR.HLD_HIST_DAILY_TEST">>control$i.ctl echo "FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'" >>control$i.ctl echo "(DMDUNIT char,DMDGROUP char,LOC char,STARTDATE date \"YYYY-MM-DD\",TYPE CHAR,EVENT \"nvl(:event,' ')\",DUR CHAR,U_SALETYPE CHAR,QTY CHAR,HISTSTREAM CHAR,U_UPDATE_TIME date \"YYYY-MM-DD\",U_ISSTATUS CHAR)" >>control$i.ctl echo $i echo "sqlldr userid=sdbmgr/sdbmgr control=control$i.ctl direct=true parallel=true &">>run.sh done #sh run.sh #for((j=1;j<=$i;j++));do # echo $j #done ##sqlldr userid=sdbmgr/sdbmgr control=control$i.ctl direct=true parallel=true