blob字段存儲文件並讀取


文檔或圖片等文件在數據庫表中以blob字段存儲並讀取的方法:

1、將文件以blob形式存放到數據庫:參考 http://bbs.csdn.net/topics/330265813
CREATE TABLE yuser (ID number,photo BLOB);
--首先要創建目錄將需要存放到數據庫的文件放到該目錄中
create or replace directory images as 'D:\images';
SELECT *FROM dba_directories
--然后將這些文件讀取存放到數據庫
 declare
   l_bfile bfile;
   l_blob blob;
 begin
   insert into yuser(ID,photo) values(1,empty_blob())
   return photo into l_blob;
   l_bfile:=bfilename('IMAGES','...test.doc');
   dbms_lob.open(l_bfile,dbms_lob.file_readonly);
   dbms_lob.loadfromfile(l_blob,l_bfile,dbms_lob.getlength(l_bfile));
   dbms_lob.close(l_bfile);
   commit;
 end;
 
 2.Oracle導出Blob存儲的圖像或文件到指定目錄:參考 http://www.cnblogs.com/dayrl/articles/1595879.html

--首先要先創建這些文件讀取后存放的目錄

create or replace directory images2 as 'D:\images2';
CREATE OR REPLACE PROCEDURE b_wzzp_dump(locationno IN NUMBER,
                                        filename   IN VARCHAR2) IS
   l_file     utl_file.file_type;
   l_buffer   RAW(32767);
   l_amount   BINARY_INTEGER := 32767;
   l_pos      INTEGER := 1;
   l_blob     BLOB;
   l_blob_len INTEGER;
BEGIN
   SELECT photo INTO l_blob FROM yuser WHERE id = locationno;

   l_blob_len := dbms_lob.getlength(l_blob);
   l_file     := utl_file.fopen('IMAGES2', filename, 'w', /*l_blob_len*/32767);

   WHILE l_pos < l_blob_len
   LOOP
      dbms_lob.read(l_blob, l_amount, l_pos, l_buffer);
      utl_file.put_raw(l_file, l_buffer, TRUE);
      l_pos := l_pos + l_amount;
   END LOOP;

   utl_file.fclose(l_file);

EXCEPTION
   WHEN OTHERS THEN
      dbms_output.put_line(SQLERRM);
      IF utl_file.is_open(l_file) THEN
         utl_file.fclose(l_file);
      END IF;
      RAISE;
END b_wzzp_dump;

execute b_wzzp_dump(locationno => 指定表中的哪個文件,filename => filename);

上述用到的一些包過程說明:
dbms_lob.read——讀取文件
dbms_lob.read(lob_loc => blob字段,amount => 每次讀取的字符數,offset => 從哪開始讀取,buffer => 緩存量);

dbms_lob.getlength——獲取blob對象的長度
dbms_lob.getlength(lob_loc => 對應的bLOB字段);

utl_file.fopen——打開文件
utl_file.fopen(location => 文件所在的目錄,filename => 文件名稱,open_mode =>打開方式(R/W/A) ,max_linesize => 文件每行最大的字符數,不能超過32767,最小為1,默認為null,表示操作系統運行時指定的值);
注:max_linesize不能超過32767,如果超過則提示“ORA-29287: 最大行大小無效”

utl_file.put_raw——將raw數據寫入文件
utl_file.put_raw(file => 文件類型,buffer => 存放raw數據的緩存,autoflush => 是自動刷新緩沖區數據);

utl_file.is_open——判斷文件是否打開,返回true或false
utl_file.is_open(file => 文件名);

utl_file.fclose——關閉文件
utl_file.fclose(file => 文件名);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM