執行DBMS_LOB包LOADCLOBFROMFILE過程出現ORA-6502錯誤

yangtingkun發表於2010-01-05

嘗試透過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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章