DBMS_LOB包LOADFROMFILE過程載入CLOB亂碼

yangtingkun發表於2010-01-12

TOM的例子裡面看到使用LOADFROMFILE載入CLOB,但是使用的過程中出現了亂碼。

 

 

10.211.2的版本中都出現相同的問題:

SQL> host echo 'test' > abc.txt

SQL> DECLARE
  2     V_LOB CLOB;
  3     V_FILE BFILE := BFILENAME('D_OUTPUT', 'abc.txt');
  4  BEGIN
  5     UPDATE T SET CONTENTS = EMPTY_CLOB RETURN CONTENTS INTO V_LOB;
  6     DBMS_LOB.FILEOPEN(V_FILE);
  7     DBMS_LOB.LOADFROMFILE(V_LOB, V_FILE, DBMS_LOB.LOBMAXSIZE);
  8     DBMS_LOB.FILECLOSEALL;
  9     COMMIT;
 10  END;
 11  /

PL/SQL 過程已成功完成。

SQL> select * from t;

        ID NAME       CONTENTS
---------- ---------- -----------------------------------------------
         1 ABC       
瑥獴

嘗試透過iconv改變檔案的格式,結果依舊。

windows上裡面notepad寫入“test”字元後,分別儲存為unicodeutf-8編碼檔案,然後以文字方式ftp到當前伺服器,利用LOADFROMFILE載入後,也是亂碼:

SQL> DECLARE
  2     V_LOB CLOB;
  3     V_FILE BFILE := BFILENAME('D_OUTPUT', 'uni.txt');
  4  BEGIN
  5     UPDATE T SET CONTENTS = EMPTY_CLOB RETURN CONTENTS INTO V_LOB;
  6     DBMS_LOB.FILEOPEN(V_FILE);
  7     DBMS_LOB.LOADFROMFILE(V_LOB, V_FILE, DBMS_LOB.LOBMAXSIZE);
  8     DBMS_LOB.FILECLOSEALL;
  9     COMMIT;
 10  END;
 11  /

PL/SQL 過程已成功完成。

SQL> SELECT * FROM T;

        ID NAME       CONTENTS
---------- ---------- ---------------------------------------------
         1 ABC       
?琀攀猀琀

SQL> DECLARE
  2     V_LOB CLOB;
  3     V_FILE BFILE := BFILENAME('D_OUTPUT', 'utf.txt');
  4  BEGIN
  5     UPDATE T SET CONTENTS = EMPTY_CLOB RETURN CONTENTS INTO V_LOB;
  6     DBMS_LOB.FILEOPEN(V_FILE);
  7     DBMS_LOB.LOADFROMFILE(V_LOB, V_FILE, DBMS_LOB.LOBMAXSIZE);
  8     DBMS_LOB.FILECLOSEALL;
  9     COMMIT;
 10  END;
 11  /

PL/SQL 過程已成功完成。

SQL> SELECT * FROM T;

        ID NAME       CONTENTS
---------- ---------- --------------------------------------------
         1 ABC       
??敳

查詢了METALINK,發現果然是Oraclebug,參考文件ID 562717.1Oracle推薦在9.2如果載入CLOB,使用LOADCLOBFROMFILE來代替。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-624979/,如需轉載,請註明出處,否則將追究法律責任。

相關文章