ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 执行DBMS_LOB包LOADCLOBFROMFILE过程出现ORA-6502错误

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

原创 Linux操作系统 作者:yangtingkun 时间:2010-01-05 18:25:00 0 删除 编辑

尝试通过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_csid和lang_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的包也存在问题,它没有进行最起码的输入参数范围的验证,也没有抛出一个具有可读性的错误信息。而且由于没有提供源代码,含混的错误信息使得调试和诊断工作变得异常困难,即使这不算是Oracle的bug,也是Oracle做的不足之处。

 

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

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1964
  • 访问量
    11076556