zoukankan      html  css  js  c++  java
  • 用SQLLDR来装载CLOB/BLOB列的控制文件例子

    Oracle的SQLLDR是用来将文本文件中的记录装载到数据库中的工具, 其并行(Parallel),直接(Direct)的装载模式是目前所知最快的方式. 不过用于指定文本格式的控制文件有点难于写, 我在写时也经常需要查阅文档. 为了方便我还是在这儿写一个例子吧, 下面是样表的结构:
    SQL> create table test(
    2 num_col number(10),
    3 char_col char(10),
    4 var_col varchar2(10),
    5 date_col date,
    6 blob_col blob,
    7 clob_col clob,
    8 raw_col raw(20)
    9 );

    Table Created.

    在这个例子中有CLOB/BLOB列, 因此直接模式不能用, 还需要将ROWS参数设为1, 下面是SQLLDR用的控制文件:

    --
    -- Generated by AUL/MyDUL, for table hr.test
    --
    OPTIONS(DIRECT=TRUE,READSIZE=4194304,ERRORS=-1,SKIP=1,ROWS=50000)
    LOAD DATA
    INFILE 'hr_test.txt' "STR X'0d0a'"
    INTO TABLE TEST
    FIELDS TERMINATED BY X'7c' TRAILING NULLCOLS
    (
    NUM_COL CHAR ,
    CHAR_COL CHAR(10) ,
    VAR_COL CHAR(10) ,
    DATE_COL DATE "YYYY-MM-DD HH24:MI:SS" ,
    LOBF_00005 FILLER CHAR(32),
    BLOB_COL LOBFILE(LOBF_00005) TERMINATED BY EOF ,
    LOBF_00006 FILLER CHAR(32),
    CLOB_COL LOBFILE(LOBF_00006) TERMINATED BY EOF ,
    RAW_COL CHAR
    )

    当然我给的参数肯定不是最好的, 请你试了后告诉我.

    当使用sqlldr加载很长的字符串(超过4000)到表中的clob类型中时,老是报错: 数据文件的字段超出最大长度.查找相关资料后得知,sqlldr每次读入文件中数据流的数据类型默认为CHAR ,长度为 255 .所以只要超过255字符的段都会报这个错.解决方法很简单,在控制文件中字段后添加上char(1000000),例如:

    LOAD DATA
    INFILE *
    INTO TABLE DEMO
    TRUNCATE
    FIELDS TERMINATED BY ','
    (d1 ,
    d2 char(1000000)
    )

    其中表demo的列d2是clob类型,当然1000000只是随便用的一个大数字,只要保证加载的长度不超这个数字就成.

    ------------------------------------------------------------

    首先建立表:

    SQL> desc lobdemo
    名称                                      是否为空? 类型
    ----------------------------------------- -------- ------------

    AA01                                      NOT NULL VARCHAR2(10)
    AA02                                      NOT NULL BLOB

    以下是ctl控制文件得写法:文件名为ctldemo.ctl

    load data
    infile 'dump002.dat'
    insert
    into table "BTGL"."LOBDEMO1"
    FIELDS TERMINATED BY '|' TRAILING NULLCOLS    
    ("AA01"                             CHAR(3) enclosed by '|',
    LOBFILE_COL1                       FILLER CHAR                     ,
    "AA02"                             LOBFILE(LOBFILE_COL1) TERMINATED BY EOF NULLIF LOBFILE_COL1 = 'NONE')

    然后在DOS下执行:
    sqlldr username/password control=ctldemo.ctl

    当时要导入得是100多万条,所以我采用了direct方式
    c:\>sqlldr username/password control=ctldemo.ctl direct=y

    sqlldr也支持多字符分隔符文件导入。只要类似fields terminated by "|||"这样就可以了! 其中|||就是分割符

  • 相关阅读:
    ClickOnce發布經驗
    reporting Server組件不全引起的致命錯誤
    異步調用
    Usercontrol Hosted in IE
    MATLAB命令大全(转载)
    一种保护眼睛的好方法
    关于oracle自动编号
    An Algorithm Summary of Programming Collective Intelligence (1)
    An Algorithm Summary of Programming Collective Intelligence (3)
    An Algorithm Summary of Programming Collective Intelligence (4)
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400586.html
Copyright © 2011-2022 走看看