创建测试表
create table USERS(user_id NUMBER,user_name VARCHAR2(50),login_times NUMBER default 1 not null ,create_time DATE default sysdate not null,update_time DATE);
创建测试数据
cat 1.csv(第一列是pl/sql导出的列,控制文件里可以忽略)" ","user_id","user_name""create_time","login_times","update_time""1","1","Nami","2019-1-5 20:34:44","3","2019-1-5 20:44:44""2","2","","2018-10-15 11:00:11","5","2018-10-15 11:10:11""3","3","xiali","2018-10-15 11:10:11","8","4","4","小张","","","""5","5","小王","2018-12-23","","2018-12-24"
创建控制文件
cat 1.ctlOPTIONS (skip=1,ERRORS=50,ROWS=1000) -- sqlldr 命令显示的选项可以写到这里边来,skip用来跳过数据中的第一行,errors最大允许50个错误,rows每次插入1000行LOAD DATAINFILE "1.csv" --指定外部数据文件,可以写多个INFILE "another_data_file.csv" 指定多个数据文件--这里还可以使 用 BADFILE、DISCARDFILE 来指定坏数据和丢弃数据的文件,truncate --操作类型,用 truncate table 来清除表中原有记录INTO TABLE users -- 要插入记录的表Fields terminated by "," -- 数据中每行记录用 "," 分隔Optionally enclosed by '"' -- 数据中每个字段用 '"' 框起, 比如字段中有 "," 分隔符时trailing nullcols --表的字段没有对应的值时允 许为空(virtual_column FILLER, --这是一个虚拟字段, 用来跳过由PL/SQL Developer生成的第一列序号user_id integer, --字段可以指定类型,(number->integer,varchar2->char)user_name,create_time DATE "YYYY-MM-DD HH24:MI:SS" "nvl(:create_time, to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'))", -- 指定接受日期的格式,相当用to_date()函数转换,当字段为空时 设置为当前时间login_times "nvl(:login_times,'1')", --当字段为空时 设置为1update_time DATE "YYYY-MM-DD HH24:MI:SS")
说明:在操作类型 truncate 位置可用以下中的一值:
1) insert —为缺省方式,在数据装载开始时要求表为空
2) append —在表中追加新记录
3) replace —删除旧记录(用 delete from table 语句),替换成新装载的记录
4) truncate —删除旧记录(用 truncate table 语句),替换成新装载的记录
导入数据
sqlldr scott/tiger control=1.ctl
不指定badfile的话 ,如果有错误数据,会生成跟INFILE一样前缀的文件 例如1.bad
生成跟控制文件一样前缀的logfile 例如1.log
[oracle@orcl ~]$ ls -lhrt 1.*
-rw-r--r-- 1 oracle oinstall 2.1K 4月 14 12:00 1.log
-rw-r--r-- 1 oracle oinstall 353 4月 14 12:00 1.csv
-rw-r--r-- 1 oracle oinstall 26 4月 14 12:00 1.bad
