梦相随1006

版权归 梦相随1006 所有,未经 https://www.cnblogs.com/xin1006 作者许可,严禁转载

导航

Oracle--大数据迁移--sqlldr技术的应用

 

1. 让表不产生REDO LOG
SQL> ALTER TABLE  table_name   nologging;

2.编写控制文件 *.ctl (重点)

如 0120.ctl

3.准备数据文件 

如 0120.csv

4. 在装有oracle服务的Linux服务器上执行

sqlldr    db_user/db_pwd@//url:port/orcl   control=0120.ctl   direct=true ; 注意这里的数据库连接串是oracle 18c的写法。

5. 执行结果

先使用 echo $?  回车,结果为0是成功;它也会生成日志文件查看具体情况的

 

详解0120.ctl的文件内容(以下表字段是原表的缩略版,删除了不少字段,但不影响使用)

OPTIONS (skip=1,rows=5000,errors=0) -- sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的第一行(第一行往往是表头)
unrecoverable                    -- 此选项必须要与DIRECT共同应用  
LOAD DATA 
CHARACTERSET 'UTF8'             --设置编码
INFILE "0120.csv"                 --指定外部数据文件  
--INFILE "0121.csv"              --若有多个数据文件要以前执行,则按照本行的写法继续写
                                --这里还可以使 用 BADFILE、DISCARDFILE 来指定坏数据和丢弃数据的文件,  
truncate                         --操作类型,truncate会清空表,还可以有 append 追加数据 
INTO TABLE table_name             -- 要插入记录的表  
Fields terminated by ","         -- 数据中每行记录用 "," 分隔  
Optionally enclosed by '"'         -- 数据中每个字段用 '"' 框起,比如字段中有 "," 分隔符时  
trailing nullcols                 --表的字段没有对应的值时允许为空  
(  
--  virtual_column FILLER,         --这是一个虚拟字段,用来跳 过由 PL/SQL Developer 生成的第一列序号,若有则需要跳过该列,否则注释掉  
  oid "sys_guid()"        ,          -- 第一个主键字段使用 oracle的uuid函数生成
  instcode                       ,-- 默认是varchar类型的,默认最大支持255的长度,如果超长的自己要手动设长度  如 instcode char(1024),
  instname                       ,   
  name                           , 
  idcard                       ,  
  phone                           , 
  dayavginsuranceassets           NULLIF (dayavginsuranceassets="") "to_number(:dayavginsuranceassets)"    ,  --表字段number类型,手动调用oracle的to_number函数转,当字段为""时就是 NULL  
  banktimepointassets           NULLIF (banktimepointassets="") "to_number(:banktimepointassets)"    ,          --表字段number类型,手动调用oracle的to_number函数转,当字段为""时就是 NULL 
  enterpriseassetsratio                    , 
  systime            "sysdate"  , --这里使用系统默认生产时间,日期字段也可以参考number类型,使用to_date("yyyy-MM-dd",:systime)
  updatetime        "sysdate"  , --这里使用系统默认生产时间,日期字段也可以参考number类型,使用to_date("yyyy-MM-dd",:updatetime)
  dayavgcurrentassets_total      NULLIF (dayavgcurrentassets_total="") "to_number(:dayavgcurrentassets_total)"     , --表字段number类型,手动调用oracle的to_number函数转,当字段为""时就是 NULL 
  stat_date                            ,
  stat_dd                              , 
  city_code                
) 

csv文件,因保密原因只能截图部分字段

 

输出日志

 

 

 

经验之谈:

1. 如果分成几个csv格式的文件插入到同一个表完成数据的导入,第一个用truncate,后面的几个请使用append;

2. 如果把多个文件让一个ctl执行时,切记后面的文件不能有表头第一行;

 

我参考了两篇文章

sqlldr的用法 (这个最完整)

sqlldr使用详解

 

posted on 2021-01-21 09:33  梦相随1006  阅读(269)  评论(0编辑  收藏  举报