CREATE OR REPLACE FUNCTION C2B (b IN CLOB default empty_clob()) RETURN BLOB -- typecasts BLOB to CLOB (binary conversion) IS res BLOB; b_len number := dbms_lob.getlength(b) ; dest_offset1 NUMBER := 1; src_offset1 NUMBER := 1; amount_c INTEGER := DBMS_LOB.lobmaxsize; blob_csid NUMBER := DBMS_LOB.default_csid; lang_ctx INTEGER := DBMS_LOB.default_lang_ctx; warning INTEGER; BEGIN if b_len > 0 then DBMS_LOB.createtemporary (res, TRUE); DBMS_LOB.OPEN (res, DBMS_LOB.lob_readwrite); DBMS_LOB.convertToBlob (res, b, amount_c, dest_offset1, src_offset1, blob_csid, lang_ctx, warning ); else select empty_blob() into res from dual ; end if ; RETURN res; -- res is OPEN here END C2B;
1,首先利用to_clob函數把varchar2字段轉成 clob字段。sql
2 利用上面函數將clob轉成blob。數據庫
說白了就是 c2b(to_clob(varchar2字段))函數
create or replace Function Blob_To_Varchar (Blob_In In Blob) Return clob Is V_Varchar Varchar2(32767); V_Varchar1 Varchar2(32767); V_Start Pls_Integer := 1; V_Buffer Pls_Integer := 4000; Begin If Dbms_Lob.Getlength(Blob_In) Is Null Then Return ''; End If; V_Varchar1 := ''; --return to_char(Ceil(Dbms_Lob.Getlength(Blob_In) / V_Buffer)); For I In 1..Ceil(Dbms_Lob.Getlength(Blob_In) / V_Buffer) Loop --當轉換出來的字符串亂碼時,可嘗試用註釋掉的函數 --V_Varchar := Utl_Raw.Cast_To_Varchar2(Utl_Raw.Convert(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start),'SIMPLIFIED CHINESE_CHINA.ZHS16GBK', 'AMERICAN_THE NETHERLANDS.UTF8')); V_Varchar := Utl_Raw.Cast_To_Varchar2(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start)); V_Varchar1 := V_Varchar1 || V_Varchar; V_Start := V_Start + V_Buffer; End Loop; Return V_Varchar1; End Blob_To_Varchar;
1.首先執行上面的函數,返回的是個cloboop
2將clob轉成varchar2spa
說白了 就是 to_char(Blob_To_Varchar(字段)).net
建立二個函數 而後就能夠用了,若是說實現 數據庫裏面大字段的批量替換仍是比較方便code
update DR_RPT_REPORT_DATASOURCE
set data_sql =
c2b(to_clob((select replace(Blob_To_Varchar(data_sql),'XXX','XXX') from DR_RPT_REPORT_DATASOURCE where data_id
='XXXX' ))) where data_id = '' ;blog
原文在這:http://blog.csdn.net/wbo112/article/details/9041575字符串