因為做項目,需要使用bfile字段存儲圖像文件,所以進行了一些研究。
bfile字段實際的文件存儲在文件系統中,字段中存儲的是文件定位指針.bfile對 
 
oracle來說是只讀的,也不參與事務性控制和數據恢復 
 
bfile的基本操作如下: 
 
 
1.先在oracle數據庫中下面我們建立一個目錄別名,用于將文件定位指針映射到文 
 
件系統:  
 
 create directory 'tmpdir' as '/tmp';  
 tmpdir表示邏輯目錄名,'/tmp'是實際目錄。 注意該目錄oracle應該有讀權限 
 
然后根據需要授權 
 grant read on directory bfile_dir1 to scott; 
建立一個含有bfile字段的表 
 create table bfiletest(id number(3), fname bfile); 
 建立一個含有blob字段的表
create table blobtest(id number(3),ablob blob);
2.插入數據 
 這里需要使用bfilename來進行bfile字段的insert 或者 update操作 
 
 insert into bfiletest 
     values (1, bfilename ('tmpdir', 'tmptest')); 
 
   bfilename的參數1是directory名,參數2是文件名。注意:這一行中插入的是 
 
一個指向/tmp/tmptest的文件定位指針映射,不是文件本身。 
 
3.讀取bfile 
   
   通過使用dbms_lob包進行可以對bfile讀入到blob/clob對象中操作(只讀)  
create or replace procedure loadlobfrombfile_proc(
tid in number,rfilename in varchar2,rfiledir in varchar2,upmessage out varchar2) 
as 
   dest_loc       blob; 
   src_loc        bfile;
begin
  insert into blobtest(id,ablob) values(tid,empty_blob()) return ablob into dest_loc;
  src_loc := bfilename(rfiledir,rfilename);
      
   /* 如果bfile文件實際存在 */ 
   if (dbms_lob.fileexists(src_loc) != 0) 
   then 
       /* 打開bfile源文件 */  
       dbms_lob.open(src_loc, dbms_lob.lob_readonly); 
       /* 打開目標blob: */  
       dbms_lob.open(dest_loc, dbms_lob.lob_readwrite); 
       /*從文件中裝入 */ 
       dbms_lob.loadfromfile(dest_loc, src_loc,dbms_lob.getlength(src_loc)); 
       /* 記得關閉: */  
       dbms_lob.close(dest_loc); 
       dbms_lob.close(src_loc); 
       commit;
       upmessage := '0'; 
   end if; 
   exception 
       when others then 
          rollback;
          upmessage := '操作失敗'; 
end;