因為varchar2最大長度為4000,所以不能直接將blob轉為varchar2,這里通過函數將blob返回為table格式來實現:
1、創建兩個新的type,用於函數返回
create or replace type obj_table as object ( name varchar2(2000) );
create or replace type t_table is table of obj_table
2、創建blob轉varchar2的函數
CREATE OR REPLACE Function Blob_To_Varchar (id In VARCHAR2) Return t_table as rs t_table:= t_table();-- 定義上面創建的類型 Blob_In blob; V_Varchar Varchar2(2000); V_Start Pls_Integer := 1; V_Buffer Pls_Integer := 2000; Begin SELECT COLIMN_BLOB_NAME into Blob_In FROM table a WHERE a.id= id; -- 根據id查詢blob所在的表 For I In 1..Ceil(Dbms_Lob.Getlength(Blob_In) / V_Buffer) Loop -- 遍歷blob --當轉換出來的字符串亂碼時,可嘗試用注釋掉的函數 --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)); rs.extend;-- 擴展已知的數組空間 rs(rs.count) := obj_table(V_Varchar);-- 往上面創建obj_table中寫入數據 V_Start := V_Start + V_Buffer; End Loop; Return rs; End Blob_To_Varchar;
3、查詢結果
select * from table(Blob_To_Varchar(id))
執行上面的語句,可獲取到對應的blob對應的varchar