SQLLDR利用EXPRESSION生成LOGFILE的文件名导致SEGMENTATION FAULT

尝试利用SQLLDR导入包含LOB的对象,当LOB文件的路径和名称在数据文件中分开保存,利用单独的字段通过EXPRESSION的方式来获得完整路径,并通过这个字段来加载LOB时,出现SEGMENTATION FAULT错误。

 

 

测试表结构如下:

SQL> DROP TABLE T_LOAD_LOB PURGE;

表已删除。

SQL> CREATE TABLE T_LOAD_LOB
2 (ID NUMBER PRIMARY KEY,
3 NAME VARCHAR2(80),
4 DIRECTORY VARCHAR2(25),
5 FULL_NAME VARCHAR2(100),
6 CREATE_DATE DATE,
7 CONTENTS BLOB);

表已创建。

控制文件如下:

LOAD DATA
INFILE *
INTO TABLE T_LOAD_LOB
FIELDS TERMINATED BY ','
(ID CHAR(255),
DIRECTORY CHAR(255),
NAME CHAR(255),
FULL_NAME EXPRESSION "DIRECTORY || '\\' || NAME",
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 6 22:40:44 2011

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

windows环境下会弹出对话框,说明sqlldr.exe已停止工作。描述信息为:出现了一个问题,导致程序停止正常工作。如果有可用的解决方案,Windows将关闭程序并通知您。

对应的LOG文件为空,数据库告警日志文件中也没有任何记录。

开始以为是Windows环境的问题,尝试重启数据库,问题依旧。索性重启了Windows环境,发现问题依然,开始怀疑问题并不是Windows下特有的。

尝试了Windows10.2.0.511.2.0.1环境的sqlldr,出现同样的错误。

于是修改控制文件,使之可以在Linux环境下运行:

[oracle@yans1 ~]$ vi sqlldr_lob.ctl

LOAD DATA
INFILE *
INTO TABLE T_LOAD_LOB
FIELDS TERMINATED BY ','
(ID CHAR(255),
DIRECTORY CHAR(255),
NAME CHAR(255),
FULL_NAME EXPRESSION ":DIRECTORY || '/' || :NAME",
CREATE_DATE SYSDATE,
CONTENTS LOBFILE(FULL_NAME) TERMINATED BY EOF)
BEGINDATA
1,/home/oracle,t_stat1.dp
2,/home/oracle,t_stat.dmp
3,/home/roacle,t_stat.dp

执行导入时,出现了SEGMENTATION FAULT的错误:

[oracle@yans1 ~]$ sqlldr test/test control=sqlldr_lob.ctl

SQL*Loader: Release 10.2.0.3.0 - Production on 星期六 8 6 20:18:07 2011

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

Segmentation fault

可以看到,这个错误在各个版本中普遍存在,如果去掉LOB的加载,则不会存在任何的错误,而如果FULL_NAME是通过数据文件中读取而不是这种EXPRESSION的方式,同样可以成功加载。

Oraclemetalink上找不到类似的问题,怀疑SQLLDR不支持EXPRESSION作为LOGFILE读取的参数,不过不管如何,出现SEGMENTATION FAULT都是不应该的。

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值