在TOM的例子里面看到使用LOADFROMFILE加载CLOB,但是使用的过程中出现了乱码。
在10.2和11.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”字符后,分别保存为unicode和utf-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,发现果然是Oracle的bug,参考文档ID 562717.1。Oracle推荐在9.2如果加载CLOB,使用LOADCLOBFROMFILE来代替。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-624979/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-624979/