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