利用SQLLDR加载包含LOB对象的数据(二)

简单描述一下通过第二数据文件方式加载LOB类型的方法。

介绍复杂一点的,文件名和目录在表中分别存储的情况。

利用SQLLDR加载包含LOB对象的数据(一):http://yangtingkun.itpub.net/post/468/521873

 

 

如果导入数据的文件名是完整的,但是在数据库中目录和文件名分别存储,这时表结构中并不需要一个完整的FULL_NAME,但是控制文件中FULL_NAME用作LOBLOGFILE读取列还是必须的,而且需要设置为BOUNDFILLER,而不能是FILLER

表结构如下:

SQL> DROP TABLE T_LOAD_LOB PURGE;

表已删除。

SQL> CREATE TABLE T_LOAD_LOB
2 (ID NUMBER,
3 NAME VARCHAR2(80),
4 DIRECTORY VARCHAR2(30),
5 CREATE_DATE DATE,
6 CONTENTS BLOB);

表已创建。

控制文件如下:

LOAD DATA
INFILE *
INTO TABLE T_LOAD_LOB
FIELDS TERMINATED BY ','
(ID CHAR(255),
FULL_NAME BOUNDFILLER CHAR(255),
DIRECTORY EXPRESSION "SUBSTR(:FULL_NAME, 1, INSTR(:FULL_NAME, '\\', -1))",
NAME EXPRESSION "SUBSTR(:FULL_NAME, INSTR(:FULL_NAME, '\\', -1) + 1)",
CREATE_DATE SYSDATE,
CONTENTS LOBFILE(FULL_NAME) TERMINATED BY EOF)
BEGINDATA
1,d:\study\yangtk\others\2006
年总结.doc
2,d:\study\yangtk\others\2007Oracle
开发者大会(一).doc
3,d:\study\yangtk\others\2007Oracle
开发者大会(二).doc
4,d:\study\yangtk\others\2007
年总结.doc
.
.
.
74,d:\study\yangtk\others\
问题诊断和PLSQL方面.doc

执行导入过程:

D:\TEMP>SQLLDR TEST/TEST CONTROL=SQLLDR_LOB2.CTL

SQL*Loader: Release 10.2.0.5.0 - Production on 星期日 8 7 22:37:28 2011

Copyright (c) 1982, 2007, Oracle. All rights reserved.

达到提交点 - 逻辑记录计数 64
达到提交点 - 逻辑记录计数 73
达到提交点 - 逻辑记录计数 74

检查导入日志:

SQL*Loader: Release 10.2.0.5.0 - Production on 星期日 8 7 22:37:28 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

控制文件:      SQLLDR_LOB2.CTL
数据文件:      SQLLDR_LOB2.CTL
 
错误文件:    SQLLDR_LOB2.bad
 
废弃文件:    未作指定

(可废弃所有记录)

要加载的数: ALL
要跳过的数: 0
允许的错误: 50
绑定数组: 64 , 最大 256000 字节
继续:    未作指定
所用路径:       常规

T_LOAD_LOB,已加载从每个逻辑记录
插入选项对此表 INSERT 生效

   列名                        位置      长度  中止 包装数据类型
------------------------------ ---------- ----- ---- ---- ---------------------
ID                                  FIRST   255   ,       CHARACTER           
FULL_NAME                            NEXT   255   ,       CHARACTER           
  (BOUNDFILLER FIELD)
DIRECTORY                                                
表达式
   
列的 SQL : "SUBSTR(:FULL_NAME, 1, INSTR(:FULL_NAME, '\', -1))"
NAME                                                     
表达式
   
列的 SQL : "SUBSTR(:FULL_NAME, INSTR(:FULL_NAME, '\', -1) + 1)"
CREATE_DATE                                               SYSDATE
CONTENTS                          DERIVED     *  EOF      CHARACTER           
   
动态 LOBFILE  文件名在字段 FULL_NAME

T_LOAD_LOB:
  74
行 加载成功。
 
由于数据错误, 0 行 没有加载。
 
由于所有 WHEN 子句失败, 0 行 没有加载。
 
由于所有字段都为空的, 0 行 没有加载。

为绑定数组分配的空间:                 33024 字节 (64 )
读取   缓冲区字节数: 1048576

跳过的逻辑记录总数:          0
读取的逻辑记录总数:            74
拒绝的逻辑记录总数:          0
废弃的逻辑记录总数:        0

从 星期日 8  07 22:37:28 2011 开始运行
在 星期日 8  07 22:37:33 2011 处运行结束

经过时间为: 00: 00: 04.73
CPU
时间为: 00: 00: 00.17

检查数据加载情况:

SQL> SELECT ID, NAME, DIRECTORY, TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')

 2  FROM T_LOAD_LOB;

        ID NAME                            DIRECTORY                    TO_CHAR(SYSDATE,'YY
---------- ------------------------------- ---------------------------- -------------------
         1 2006
年总结.doc                   d:\study\yangtk\others\     2011-08-07 22:42:01
         2 2007Oracle
开发者大会(一).doc   d:\study\yangtk\others\     2011-08-07 22:42:01
         3 2007Oracle
开发者大会(二).doc   d:\study\yangtk\others\     2011-08-07 22:42:01
         4 2007
年总结.doc                   d:\study\yangtk\others\     2011-08-07 22:42:01
.
.
.
        74
问题诊断和PLSQL方面.doc       d:\study\yangtk\others\        2011-08-07 22:42:01

已选择74行。

SQL> CREATE INDEX IND_T_LOB_CONTENTS
  2  ON T_LOAD_LOB(CONTENTS)
  3  INDEXTYPE IS CTXSYS.CONTEXT;

索引已创建。

SQL> SELECT COUNT(*)
  2  FROM T_LOAD_LOB
  3  WHERE CONTAINS (CONTENTS, 'ORACLE') > 0;

  COUNT(*)
----------
        52

对于文件名和目录分别存储的情况,可以利用EXPRESSION来从FULL_NAME中通过SQL函数来获取需要的信息,而FULL_NAME定义为BOUNDFILLER,这样并不需要FULL_NAME在表中存在,还可以使用LOBFILEFULL_NAME中读取LOB

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-704370/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-704370/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值