1. 程式人生 > >ORA-22835 緩沖區對於 CLOB 到 CHAR 轉換或 BLOB 到 RAW 轉換而言太小

ORA-22835 緩沖區對於 CLOB 到 CHAR 轉換或 BLOB 到 RAW 轉換而言太小

eric func 註釋 turn 替換 異常 bms .get erl

在使用Oralce時,直接取出 CLOB 到 CHAR 轉換或 BLOB 到 RAW 轉換時,會出現ORA-22835的異常,以下是個人的解決方案
 1 create or replace Function BlobToVarchar (Blob_In In Blob) Return clob
 2 Is
 3     V_Varchar Varchar2(32767);
 4      V_Varchar1 Varchar2(32767);
 5     V_Start Pls_Integer := 1;
 6     V_Buffer Pls_Integer := 4000;
 7 Begin
8 9 If Dbms_Lob.Getlength(Blob_In) Is Null Then 10 Return ‘‘; 11 End If; 12 V_Varchar1 := ‘‘; 13 --return to_char(Ceil(Dbms_Lob.Getlength(Blob_In) / V_Buffer)); 14 For I In 1..Ceil(Dbms_Lob.Getlength(Blob_In) / V_Buffer) Loop 15 --當轉換出來的字符串亂碼時,可嘗試用註釋掉的函數 16 --
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‘)); 17 V_Varchar := Utl_Raw.Cast_To_Varchar2(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start)); 18 V_Varchar1 := V_Varchar1 ||
V_Varchar; 19 20 V_Start := V_Start + V_Buffer; 21 End Loop; 22 23 Return V_Varchar1; 24 25 End Blob_To_Varchar;

1.首先執行上面的函數,返回的是個clob

2將clob轉成varchar2 說白了 就是 to_char(Blob_To_Varchar(字段)) 創建二個函數 然後就可以用了,如果說實現 數據庫裏面大字段的批量替換還是比較方便
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 = ‘‘ ;

ORA-22835 緩沖區對於 CLOB 到 CHAR 轉換或 BLOB 到 RAW 轉換而言太小