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 "|||"这样就可以了! 其中|||就是分割符

  • 相关阅读:
    使用DBCP时发生AbstractMethodError异常
    Android NDK 环境搭建 + 测试例程
    一个关于含有显式实参的虚函数调用问题解释
    cookie和session
    hello
    python 多线程多进程
    python 网络编程
    docker 制作镜像
    docker 数据卷存储
    docker 简单原理及相关命令(镜像拉取 删除 执行容器 进入容器)
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400586.html
Copyright © 2011-2022 走看看