尝试通过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博客 ” ,链接:http://blog.itpub.net/4227/viewspace-624376/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-624376/