创建测试表

  1. create table USERS
  2. (
  3. user_id NUMBER,
  4. user_name VARCHAR2(50),
  5. login_times NUMBER default 1 not null ,
  6. create_time DATE default sysdate not null,
  7. update_time DATE
  8. );

创建测试数据

  1. cat 1.csv(第一列是pl/sql导出的列,控制文件里可以忽略)
  2. " ","user_id","user_name""create_time","login_times","update_time"
  3. "1","1","Nami","2019-1-5 20:34:44","3","2019-1-5 20:44:44"
  4. "2","2","","2018-10-15 11:00:11","5","2018-10-15 11:10:11"
  5. "3","3","xiali","2018-10-15 11:10:11","8",
  6. "4","4","小张","","",""
  7. "5","5","小王","2018-12-23","","2018-12-24"

创建控制文件

  1. cat 1.ctl
  2. OPTIONS (skip=1,ERRORS=50,ROWS=1000) -- sqlldr 命令显示的选项可以写到这里边来,skip用来跳过数据中的第一行,errors最大允许50个错误,rows每次插入1000
  3. LOAD DATA
  4. INFILE "1.csv" --指定外部数据文件,可以写多个INFILE "another_data_file.csv" 指定多个数据文件
  5. --这里还可以使 BADFILEDISCARDFILE 来指定坏数据和丢弃数据的文件,
  6. truncate --操作类型,用 truncate table 来清除表中原有记录
  7. INTO TABLE users -- 要插入记录的表
  8. Fields terminated by "," -- 数据中每行记录用 "," 分隔
  9. Optionally enclosed by '"' -- 数据中每个字段用 '"' 框起, 比如字段中有 "," 分隔符时
  10. trailing nullcols --表的字段没有对应的值时允 许为空
  11. (
  12. virtual_column FILLER, --这是一个虚拟字段, 用来跳过由PL/SQL Developer生成的第一列序号
  13. user_id integer, --字段可以指定类型,(number->integer,varchar2->char)
  14. user_name,
  15. create_time DATE "YYYY-MM-DD HH24:MI:SS" "nvl(:create_time, to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'))", -- 指定接受日期的格式,相当用to_date()函数转换,当字段为空时 设置为当前时间
  16. login_times "nvl(:login_times,'1')", --当字段为空时 设置为1
  17. update_time DATE "YYYY-MM-DD HH24:MI:SS"
  18. )

说明:在操作类型 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