將Oracle BLOB數據遷移到BFILE中

2950阅读 1评论2015-04-28 gangjh
分类:Oracle

  Oracle Blob數據欄位中可以存放二進制數據,

  有一段時間, 備份數據增長異常,備份時間也拖長到幾小時. 經分析發現,開發人員設計了存blob的Table,
  將圖片,pdf,xls,email等存進來.
  系統已經交付,在正常運作,怎麼處理才能影響最小,又能達到同樣效果?

我的解決思路是這樣子的.
1.新增一個bfile欄位bfiledata
 2.用utl_file將超過一段時間的blob轉到bfiledata,用排程自動處理.
3.建立bfile轉blob函數
4.修改客戶端查詢代碼, 用nvl(filebin,pkg_lob_data.get_blob(bfiledata)) 替換直接select filebin
    新增,修改部份不動.

相關代碼實現很簡單
2. blob保存到file

点击(此处)折叠或打开

  1. procedure to_file(src in blob, location varchar2, filename varchar2 )
  2.   is
  3.     t_fh utl_file.file_type;
  4.     t_len pls_integer := 32767;
  5.   begin
  6.     t_fh := utl_file.fopen(location, filename, 'wb' );
  7.     for i in 0 .. trunc( ( dbms_lob.getlength( src ) - 1 ) / t_len )
  8.     loop
  9.       utl_file.put_raw( t_fh
  10.                       , dbms_lob.substr( src , t_len , i * t_len + 1 )
  11.                       );
  12.     end loop;
  13.     utl_file.fclose( t_fh );
  14.   end;

  3.

点击(此处)折叠或打开

  1. function get_blob(src in bfile ) return blob is
  2.   dest blob ;
  3.   bfile_loc bfile :=src;
  4. begin
  5.   if src is null then
  6.     return null;
  7.   end if ;
  8.   dbms_lob.createtemporary(dest, true, dbms_lob.call) ;
  9.   dbms_lob.open(bfile_loc, dbms_lob.lob_readonly);
  10.   dbms_lob.loadfromfile(dest, bfile_loc, dbms_lob.getlength(bfile_loc) ) ;
  11.   dbms_lob.close(bfile_loc) ;
  12.   return dest ;
  13. end ;
抓取測試.

点击(此处)折叠或打开

  1. select nvl(filebin,pkg_lob_data.get_blob(bfiledata)) aa
  2. from y3_outapld_files_chris
  3. where rownum <5
問題1.
   bfile指明文件名時可以用子目錄,但utl_file不支持子目錄.  文件過多時不方便管理
解答:在utl_file寫時臨時create directory目錄,處理後刪除. bfilename使用同一個目錄.

  以上為個人在dba工作中的一點處理經驗.

阿飛
  2015/04/28
上一篇:dual 在plsql函數中的影響
下一篇:利用oracle session的client_info記錄用戶登入信息

文章评论