tearf001
7/25/2018 - 9:48 AM

oracle通过sqlldr导入文本数据

--实战用例:
path-to-oracle-client\BIN\sqlldr userid=用户名/密码@tns名 control=控制文件.ctl direct=y  parallel=y readsize=10005008 errors=999999999

--控制文件.ctl内容:

load data      
CHARACTERSET 'UTF8'            
infile "webdata20180724_wh.txt"
Append into table xw_tmp_to_liuling_20180725
fields terminated by "," 
trailing nullcols
(a,b,c)  

-- 注列头可选,列头顺序指定,找不到就默认顺序


--------------ORACLE官方内置导入命令SQLLDR介绍-------------
oracle通过sqlldr导入文本数据
 执行命令:

sqlldr userid=epay/epay control=/tmp/test.ctl log=/tmp/test.log data=/tmp/test.csv rows=10
命令参数:
userid -- Oracle 的 username/password[@servicename]
control -- 控制文件,可能包含表的数据
log -- 记录导入时的日志文件,默认为 控制文件(去除扩展名).log
bad -- 坏数据文件,默认为 控制文件(去除扩展名).bad
data -- 数据文件,一般在控制文件中指定。用参数控制文件中不指定数据文件更适于自动操作
errors -- 允许的错误记录数,可以用他来控制一条记录都不能错
rows -- 多少条记录提交一次,默认为 64
skip -- 跳过的行数,比如导出的数据文件前面几行是表头或其他描

----- 一下参数不太重要,或很少用到-----

load -- 要加载的逻辑记录的数目  (全部默认)
silent -- 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区)
direct -- 使用直接路径                     (默认 FALSE)
parfile -- 参数文件: 包含参数说明的文件的名称
parallel -- 执行并行加载                    (默认 FALSE)
file -- 要从以下对象中分配区的文件  

------以下参数为高级特性,专家模式用

skip_unusable_indexes -- 不允许/允许使用无用的索引或索引分区  (默认 FALSE)
skip_index_maintenance -- 没有维护索引, 将受到影响的索引标记为无用  (默认 FALSE)
commit_discontinued -- 提交加载中断时已加载的行  (默认 FALSE)
bindsize -- 常规路径绑定数组的大小 (以字节计)  (默认 256000)
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)

 ctl脚本

load data
append into table "T_USER_CTRL"  -- 操作类型
  -- 1) insert     --为缺省方式,在数据装载开始时要求表为空
  -- 2) append  --在表中追加新记录
  -- 3) replace  --删除旧记录(用 delete from table 语句),替换成新装载的记录
  -- 4) truncate --删除旧记录(用 truncate table 语句),替换成新装载的记录
fields terminated by ' '   -- 数据分隔符
trailing   nullcols
(ID,CUST_NUM,CARD_NO,MER_DAY_AMT,MER_DAY_AMT_DATE DATE "YYYY-MM-DD HH24")


CSV数据

1 606110048163089 6218710000005136 3 2017-01-01
1 606110048163089 6218710000005136 3 2017-01-01
1 606110048163089 6218710000005136 3 2017-01-01
1 606110048163089 6218710000005136 3 2017-01-01
 

复杂实例:

数据:

insert into users values(1,'Unmi',3,sysdate); 
insert into users values(2,NULL,5,to_date('2008-10-15','YYYY-MM-DD')); 
insert into users values(3,'隔叶黄莺',8,to_date('2009-01-02','YYYY-MM-DD')); 
insert into users values(4,'Kypfos',NULL,NULL); 
insert into users values(5,'不知秋',1,to_date('2008-12-23','YYYY-MM-DD'));

"   ","USER_ID","USER_NAME","LOGIN_TIMES","LAST_LOGIN"
"1","1","Unmi","3","2009-1-5 20:34:44"
"2","2","","5","2008-10-15"
"3","3","隔叶黄莺","8","2009-1-2"
"4","4","Kypfos","",""
"5","5","不知秋","1","2008-12-23"


CTL脚本(数据存放在脚本中也可分离出)

OPTIONS (skip=1,rows=128) -- sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的第一行 
LOAD DATA 
INFILE *  -- 因为数据同控制文件在一起,所以用 * 表示 
append    -- 这里用了 append 来操作,在表 users 中附加记录  
INTO TABLE users 
when LOGIN_TIMES<>'8'  -- 还可以用 when 子句选择导入符合条件的记录 
Fields terminated by ","
trailing nullcols 
( 
  virtual_column FILLER, --跳过由 PL/SQL Developer 生成的第一列序号 
  user_id "user_seq.nextval", --这一列直接取序列的下一值,而不用数据中提供的值 
  user_name "'Hi '||upper(:user_name)",--,还能用SQL函数或运算对数据进行加工处理 
  login_times terminated by ",", NULLIF(login_times='NULL') --可为列单独指定分隔符 
  last_login DATE "YYYY-MM-DD HH24:MI:SS" NULLIF (last_login="NULL") -- 当字段为"NULL"时就是 NULL 
) 
BEGINDATA --数据从这里开始 
   ,USER_ID,USER_NAME,LOGIN_TIMES,LAST_LOGIN 
1,1,Unmi,3,2009-1-5 20:34 
2,2,Fantasia,5,2008-10-15 
3,3,隔叶黄莺,8,2009-1-2 
4,4,Kypfos,NULL,NULL
5,5,不知秋,1,2008-12-23


执行命令

sqlldr user/passwd@dbservice control=users.ctl