解決dbms_lob.loadfromfile載入lob資料後出現亂碼的問題

wxjzqym發表於2012-09-27
   今天接到個需求,要將一個文字檔案的內容給載入到某個表的clob欄位中,之前對lob瞭解很少,不過在tom的expert-one-on-one中介紹了可以透過如下儲存過程來實現這個功能。  
declare
a_clob clob;
a_warn integer;
bfile_name bfile :=bfilename('FILE_DUMP','3.txt');
begin
  insert into clobtest values (empty_clob())
  returning col1 into a_clob;
  dbms_lob.fileopen(bfile_name);
  dbms_lob.loadfromfile(a_clob, bfile_name,dbms_lob.getlength(bfile_name));
  dbms_lob.fileclose(bfile_name);
  commit;
end;
/
    使用該過程後,查詢資料發現有亂碼,出現亂碼的根本原因是dbms_lob包裡的loadfromfile過程不支援變長的字符集,比如GBK,UTF8等。解決方法的可以使用dbms_lob包裡的另外一個過程loadclobfromfile過程,因為此過程中有個引數叫BFILE_CSID,這個引數可以用來指定bfile檔案使用的字符集編碼。使用方法如下:
declare
v_clob clob;
bfil bfile :=bfilename('FILE_DUMP','3.txt');
dest_offset number :=1;
source_offset number :=1;
src_csid number :=NLS_CHARSET_ID('UTF8');
lang_ctx integer :=DBMS_LOB.DEFAULT_LANG_CTX;
warn integer;
begin
  insert into clobtest values (empty_clob())
  returning col1 into v_clob;
  dbms_lob.fileopen(bfil);
  DBMS_LOB.LOADCLOBFROMFILE(v_clob,bfil,DBMS_LOB.LOBMAXSIZE,dest_offset,source_offset,src_csid,lang_ctx,warn);
  dbms_lob.fileclose(bfil);
  commit;
end;
/

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

相關文章