简单描述一下通过第二数据文件方式加载LOB类型的方法。
介绍复杂一点的,文件名和目录在表中分别存储的情况。
利用SQLLDR加载包含LOB对象的数据(一):http://yangtingkun.itpub.net/post/468/521873
如果导入数据的文件名是完整的,但是在数据库中目录和文件名分别存储,这时表结构中并不需要一个完整的FULL_NAME,但是控制文件中FULL_NAME用作LOB的LOGFILE读取列还是必须的,而且需要设置为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在表中存在,还可以使用LOBFILE从FULL_NAME中读取LOB。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-704370/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-704370/