执行DBMS_LOB包LOADCLOBFROMFILE过程出现ORA-6502错误

尝试通过DBMS_LOB包的LOADCLOBFROMFILE过程从操作系统向CLOB中加载数据,没想到碰到了错误。

 

 

执行的SQL语句如下:

SQL> CREATE TABLE T
  2  (
  3     ID NUMBER,
  4     NAME VARCHAR2(30),
  5     CONTENTS CLOB,
  6     CONSTRAINT PK_T PRIMARY KEY (ID)
  7  );

表已创建。

SQL> INSERT INTO T
  2  VALUES (1, 'ABC', 'TEST');

已创建 1 行。

SQL> DECLARE
  2     V_LOB CLOB;
  3     V_FILE BFILE := BFILENAME('D_OUTPUT', 'streams_doc.txt');
  4     V_SOURCE NUMBER := 1;
  5     V_DEST NUMBER := 1;
  6     V_LANG NUMBER;
  7     V_WARN NUMBER;
  8  BEGIN
  9     UPDATE T SET CONTENTS = EMPTY_CLOB RETURN CONTENTS INTO V_LOB;
 10     DBMS_LOB.FILEOPEN(V_FILE);
 11     DBMS_LOB.OPEN(V_LOB, DBMS_LOB.LOB_READWRITE);
 12     DBMS_LOB.LOADCLOBFROMFILE(V_LOB,
 13             V_FILE,
 14             DBMS_LOB.LOBMAXSIZE,
 15             V_DEST,
 16             V_SOURCE,
 17             NULL,
 18             V_LANG,
 19             V_WARN);
 20     DBMS_LOB.CLOSE(V_LOB);
 21     DBMS_LOB.FILECLOSEALL;
 22     COMMIT;
 23  END;
 24  /
DECLARE
*
1 行出现错误:
ORA-06502: PL/SQL:
数字或值错误
ORA-06512:
"SYS.DBMS_LOB", line 890
ORA-06512:
line 12

这个错误发生在DBMS_LOB包中的某处,一般来说这种错误是不可控的。因为DBMS_LOB包是经过WRAP工具加密的,既没有办法看到代码,也没有办法跟踪。

考虑再三,认为问题可能是由于输入参数有误造成的,再次仔细的阅读文档,发现bfile_csidlang_context参数的输入值应为0,而不是NULL

SQL> DECLARE
  2     V_LOB CLOB;
  3     V_FILE BFILE := BFILENAME('D_OUTPUT', 'streams_doc.txt');
  4     V_SOURCE NUMBER := 1;
  5     V_DEST NUMBER := 1;
  6     V_LANG NUMBER := 0;
  7     V_WARN NUMBER;
  8  BEGIN
  9     UPDATE T SET CONTENTS = EMPTY_CLOB RETURN CONTENTS INTO V_LOB;
 10     DBMS_LOB.FILEOPEN(V_FILE);
 11     DBMS_LOB.OPEN(V_LOB, DBMS_LOB.LOB_READWRITE);
 12     DBMS_LOB.LOADCLOBFROMFILE(V_LOB,
 13             V_FILE,
 14             DBMS_LOB.LOBMAXSIZE,
 15             V_DEST,
 16             V_SOURCE,
 17             0,
 18             V_LANG,
 19             V_WARN);
 20     DBMS_LOB.CLOSE(V_LOB);
 21     DBMS_LOB.FILECLOSEALL;
 22     COMMIT;
 23  END;
 24  /

PL/SQL 过程已成功完成。

SQL> SELECT ID, NAME, DBMS_LOB.SUBSTR(CONTENTS, 20, 1) CONTENTS
  2  FROM T;

        ID NAME                           CONTENTS
---------- ------------------------------ --------------------------------------------------
         1 ABC                            If one or more mater

虽然问题是由于阅读文档不仔细造成的,但是Oracle的包也存在问题,它没有进行最起码的输入参数范围的验证,也没有抛出一个具有可读性的错误信息。而且由于没有提供源代码,含混的错误信息使得调试和诊断工作变得异常困难,即使这不算是Oraclebug,也是Oracle做的不足之处。

 

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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值