PlSql Loader 详细学习

1、SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中。SQL*LOADER是大型数据
仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。


2、在NT下,SQL*LOADER的命令为SQLLDR,在UNIX下一般为sqlldr/sqlload。
如Windows下执行:
C:\Documents and Settings\Administrator>sqlldr

SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 4月 18 11:45:19 2012

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


3、在Windows下执行:C:\Documents and Settings\Administrator>sqlldr 
可以获取如下帮助信息如下,补充了自己的一部分认识:
用法: SQLLDR keyword=value [,keyword=value,...]
有效的关键字:
    userid -- ORACLE 用户名/口令:Oracle 的 username/password[@servicename]
   control -- 控制文件名
       log -- 日志文件名:记录导入时的日志文件,默认为 控制文件(去除扩展名).log
       bad -- 错误文件名:坏数据文件,默认为 控制文件(去除扩展名).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  (默认 NOT_USED)
columnarrayrows -- 直接路径列数组的行数  (默认 5000)
     streamsize -- 直接路径流缓冲区的大小 (以字节计)  (默认 256000)
 multithreading -- 在直接路径中使用多线程
      resumable -- 启用或禁用当前的可恢复会话  (默认 FALSE)
 resumable_name -- 有助于标识可恢复语句的文本字符串
resumable_timeout -- RESUMABLE 的等待时间 (以秒计)  (默认 7200)
     date_cache -- 日期转换高速缓存的大小 (以条目计)  (默认 1000)
no_index_errors -- 出现任何索引错误时中止加载  (默认 FALSE)

PLEASE NOTE: 命令行参数可以由位置或关键字指定。前者的例子是 'sqlldr scott/tiger foo'; 后一种情况的一个示例是 'sqlldr control=foo userid=scott/tiger'。
位置指定参数的时间必须早于但不可迟于由关键字指定的参数。
例如,
允许 'sqlldr scott/tiger control=foo logfile=log',
但是不允许 'sqlldr scott/tiger control=foo log', 即使参数 'log' 的位置正确。


4、sql loader 使用例子
前期描述:
数据将导入的表的表结构如下
create table user_test
     (
        id   VARCHAR2(32) not null,
        username  VARCHAR2(64),
        password  VARCHAR2(128),
        birthday  VARCHAR2(32)
     )

数据文件Excel:test.xls

   a)、SQL*LOADER 将Excel 数据文件导入到 Oracle数据库指定表中。       
        (1.创建SQL*Loader 输入数据所需要的文件,均保存到C:\,用记事本编辑:
            数据文件:test.txt 是由数据文件test.xls 转换生成的,使用的是制表符为分隔符。
           
            控制文件:input.ctl,内容如下:          
          load data           --1、控制文件标识
          infile 'C:\test.txt'     --2、数据源文件名为test.txt
          append into table user_test  --3、向表test中追加记录
          fields terminated by X'09'  --4、字段终止于X'09',是一个制表符(TAB)
          (id,username,password,birthday)   -----定义列对应顺序
         
        其中: 
        a、insert,为缺省方式,在数据装载开始时要求表为空
        b、append,在表中追加新记录
        c、replace,删除旧记录,替换成新装载的记录
        d、truncate,同上          

        在DOS窗口下使用SQL*Loader命令实现数据的输入:         
        C:\>sqlldr userid=用户名/密码@服务名 control=input.ctl
          默认日志文件名为:input.log
          默认坏记录文件为:input.bad
         
        (2.还有一种方法
        可以把Excel文件另存为CSV(逗号分隔)(*.csv),控制文件就改为用逗号分隔
        LOAD DATA
        INFILE 'C:\test.csv'
        APPEND  INTO TABLE user_test
        FIELDS TERMINATED BY ","
        (id,username,password,birthday)


    b)、在控制文件中直接导入数据
        (1、控制文件test.ctl的内容:
            LOAD DATA
            INFILE 'C:\test.csv'          
            INSERT INTO TABLE EMCCOUNTRY
            Fields terminated by ";" Optionally enclosed by '"'
            (           
              id,
              username,
              password NULLIF (CONTINENTID="NULL"),           
              birthday DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (birthday="NULL")
            )
            BEGINDATA
            "1";"JP";"Japan";"09/16/2004 16:31:32";
            "2";"CN";NULL;"09/16/2004 16:31:32";
            "3";"IN";"India";NULL;
        
        (2、执行导入命令: C:\>sqlldr userid=用户/密码@服务名 control=test.ctl
        
        如果想去掉字段中含双引号方式,可以改写控制文件,使用如下:
        控制文件test.ctl的内容:
            LOAD DATA
            INFILE 'C:\test.csv'          
            INSERT INTO TABLE EMCCOUNTRY
            Fields terminated by ";" Optionally enclosed by '"'
            (           
              id "substr(:id,2,length(:id)-2)",
              username "substr(:username,2,length(:username)-2)",
              password "substr(:password,2,length(:password)-2)" NULLIF (CONTINENTID="NULL"),           
              birthday "substr(:birthday,2,length(:birthday)-2)" DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (birthday="NULL")
            )
            BEGINDATA
            "1";"JP";"Japan";"09/16/2004 16:31:32";
            "2";"CN";"NULL";"09/16/2004 16:31:32";
            "3";"IN";"India";"NULL";

 

5、常用技巧
         (1、***** 常用的 sqlldr 命令显示的选项
             OPTIONS (skip=2,rows=128)   -- skip=2 用来跳过数据中的前两行,
             load data
             infile 'C:\test.csv'
             append
             into table user_test
             Fields terminated by ','
             (id,username,password,birthday)

            或可以直接在执行命令的时候显示地加入参数:sqlldr 用户名/密码@服务名 input.ctl skip=2


        (2、***** 普通装载
           LOAD DATA
           INFILE *
           INTO TABLE user_test
           REPLACE
           FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
           (DEPTNO,
            DNAME,
            LOC
           )
           BEGINDATA
           10,Sales,"""USA"""
           20,Accounting,"Virginia,USA"
           30,Consulting,Virginia
           40,Finance,Virginia
           50,"Finance","",Virginia // loc 列将为空
           60,"Finance",,Virginia // loc 列将为空

           注意:begindata 后的数值前面不能有空格

        (3、***** FIELDS TERMINATED BY WHITESPACE 和 FIELDS TERMINATED BY x'09' 的情况
           LOAD DATA
           INFILE *
           INTO TABLE user_test
           REPLACE
           FIELDS TERMINATED BY WHITESPACE
           -- FIELDS TERMINATED BY x'09'
           (id,
            username,
            password,
            birthday
           )
           BEGINDATA
           20 lili 123456a* 19900807


       ( 4、***** 指定不装载那一列
           LOAD DATA
           INFILE *
           INTO TABLE user_test
           REPLACE
           FIELDS TERMINATED BY ','
           (id,
            username,
            password FILLER,  --下面的 "123456a*" 将不会被装载
            birthday
           )
           BEGINDATA
           20,lili,123456a*,19900807


        (5、***** 使用函数日期的一种表达 TRAILING NULLCOLS 的使用
          LOAD DATA
          INFILE *
          INTO TABLE DEPT
          REPLACE
          FIELDS TERMINATED BY ','
          TRAILING NULLCOLS // 其实下面的ENTIRE_LINE在BEGINDATA后面的数据中是没有直接对应的列的值的。如果第一行改为 10,Sales,Virginia,1/5/2000,, 就不用TRAILING NULLCOLS了
          (DEPTNO,
           DNAME "upper(:dname)", // 使用函数
           LOC "upper(:loc)",
           LAST_UPDATED date 'dd/mm/yyyy', // 日期的一种表达方式 还有'dd-mon-yyyy' 等
           ENTIRE_LINE ":deptno||:dname||:loc||:last_updated"
          )
          BEGINDATA
          10,Sales,Virginia,1/5/2000
          20,Accounting,Virginia,21/6/1999
          30,Consulting,Virginia,5/1/2000
          40,Finance,Virginia,15/3/2001


       ( 6、***** 使用自定义的函数,解决的时间问题
          create or replace
          function my_to_date( p_string in varchar2 ) return date
          as
          /
         
          LOAD DATA
          INFILE *
          INTO TABLE DEPT
          REPLACE
          FIELDS TERMINATED BY ','
          TRAILING NULLCOLS
          (DEPTNO,
           DNAME "upper(:dname)",
           LOC "upper(:loc)",
           LAST_UPDATED "my_to_date( :last_updated )" // 使用自定义的函数
          )
          BEGINDATA
          10,Sales,Virginia,01-april-2001
          20,Accounting,Virginia,13/04/2001
          30,Consulting,Virginia,14/04/2001 12:02:02
          40,Finance,Virginia,987268297
          50,Finance,Virginia,02-apr-2001


        (7、***** 合并多行记录为一行记录
          LOAD DATA
          INFILE *
          concatenate 3 // 通过关键字concatenate 把几行的记录看成一行记录
          INTO TABLE DEPT
          replace
          FIELDS TERMINATED BY ','
          (DEPTNO,
           DNAME "upper(:dname)",
           LOC "upper(:loc)",
           LAST_UPDATED date 'dd/mm/yyyy'
          )
          BEGINDATA
          10,Sales, // 其实以下3行看成一行 10,Sales,Virginia,1/5/2000
          Virginia,
          1/5/2000

 

(8、***** 载入有换行符的数据
注意: unix 和 windows 不同 & /n
< 1 > 使用一个非换行符的字符
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS "replace(:comments,'n',chr(10))" // replace 的使用帮助转换换行符
)
BEGINDATA
10,Sales,Virginia,01-april-2001,This is the SalesnOffice in Virginia
20,Accounting,Virginia,13/04/2001,This is the AccountingnOffice in Virginia
30,Consulting,Virginia,14/04/2001 12:02:02,This is the ConsultingnOffice in Virginia
40,Finance,Virginia,987268297,This is the FinancenOffice in Virginia

< 2 > 使用fix属性
LOAD DATA
INFILE demo17.dat "fix 101"
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS
)
demo17.dat
10,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia
20,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia
40,Finance,Virginia,987268297,This is the Finance
Office in Virginia

// 这样装载会把换行符装入数据库 下面的方法就不会 但要求数据的格式不同

LOAD DATA
INFILE demo18.dat "fix 101"
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS
)
demo18.dat
10,Sales,Virginia,01-april-2001,"This is the Sales
Office in Virginia"
20,Accounting,Virginia,13/04/2001,"This is the Accounting
Office in Virginia"
30,Consulting,Virginia,14/04/2001 12:02:02,"This is the Consulting
Office in Virginia"
40,Finance,Virginia,987268297,"This is the Finance
Office in Virginia"

< 3 > 使用var属性
LOAD DATA
INFILE demo19.dat "var 3"
// 3 告诉每个记录的前3个字节表示记录的长度 如第一个记录的 071 表示此记录有 71 个字节
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS
)
demo19.dat
07110,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia
07820,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia
08730,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia
07140,Finance,Virginia,987268297,This is the Finance
Office in Virginia

< 4 > 使用str属性
最灵活的一种可定义一个新的行结尾符 win 回车换行 : chr(13)||chr(10)
此列中记录是以 a|rn 结束的
select utl_raw.cast_to_raw('|'||chr(13)||chr(10)) from dual;
结果 7C0D0A

LOAD DATA
INFILE demo20.dat "str X'7C0D0A'"
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS
)

demo20.dat
10,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia|
20,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia|
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia|
40,Finance,Virginia,987268297,This is the Finance
Office in Virginia|

==============================================================================

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值