怎樣在Oracle中創建,維護圖形大對象
2024-08-29 13:36:32
供稿:網友
 
             
  通過一個例子給大家介紹一下在Oracle中使用大對象的方法。在這個例子中,目的是要把一個jpeg圖像裝入Oracle,并且用C++Builder顯示出來。假如使用bmp圖像,則處理的過程更簡單一些,這里就不再鰲述了。 
   
  例子: 
  1. 創建一個表picture 
                                                                                              create table picture 
  ( 
  picture_name varchar2(30), 
  picture_blob blob, 
  picture_locator bfile 
  ); 
   
  2. 創建一個目錄,需要有DBA權限,用于指向在操作系統中的某個目錄 
  create Directory picture_dir as 'd:/blob_test'; 
  假設在d:/blob_test目錄下存放有pic.jpg、pic.bmp、pic.doc等文件 
   
  3. 插入一條記錄,注重blob對象需要初始化為空對象,對于Blob類型的大對象必須用Empty_blob()函數。 
  insert into picture (picture_name,picture_blob,picture_locator ) 
  values( 
  'pic1',empty_blob(),bfilename('PICTURE_DIR','PIC.JPG')); 
   
  4. 將picture_locator所指向的圖形文件導入數據庫的picture表中: 
  declare 
  l_pic_locator bfile; 
  l_pic_blob blob; 
  l_dir varchar2(200); 
  l_filename varchar2(200); 
  BEGIN 
  select picture_locator,picture_blob into l_pic_locator,l_pic_blob from picture where name='pic1'; 
  -- 1。判定文件是否存在 
  IF DBMS_LOB.FILEEXISTS(l_pic_locator)=1 then 
  dbms_output.put_line('!!! The file exists!'); 
  -- 2. 判定文件是否已被打開 
  if dbms_lob.fileisopen(l_pic_locator)=0 THEN 
  DBMS_OUTPUT.PUT_LINE(' THE FILE IS NOT OPEN, TO OPEN THE FILE...'); 
  -- 3. 打開文件 
  DBMS_LOB.FILEOPEN(l_pic_locator); 
  DBMS_OUTPUT.PUT_LINE('!!! THE FILE IS OPENED!'); 
   
  -- 4. 可以獲得關于文件的一些信息,比如文件名,大小等 
  dbms_output.put_line('The Length of the file is:'to_char(dbms_lob.getlength(l_pic_locator))); 
  dbms_lob.filegetname(l_pic_locator,l_dir,l_filename); 
  DBMS_OUTPUT.PUT_LINE('The opened file name is :'l_dir'/'l_filename); 
  -- 5. 將外部jpeg文件裝入Blob字段 
  DBMS_LOB.LOADFROMFILE(l_pic_blob,l_pic_locator,dbms_lob.getlength(l_pic_locator),1,1); 
  dbms_output.put_line('The file is loaded into database!'); 
   
  END IF; 
  DBMS_OUTPUT.PUT_LINE('To close the file'); 
  --6. 每一個fileopen必須有一個fileclose與之對應,所以關閉文件 
  IF DBMS_LOB.FILEISOPEN(l_pic_locator)=1 THEN 
  DBMS_LOB.FILECLOSE(l_pic_locator); 
  DBMS_OUTPUT.PUT_LINE('The file is closed!'); 
  END IF; 
   
  END IF; 
  -- 7. 還必須在exception中保證文件關閉文件 
  exception 
  when others then 
  IF DBMS_LOB.FILEISOPEN(L_PIC)=1 THEN 
  DBMS_LOB.FILECLOSE(L_PIC); 
  DBMS_OUTPUT.PUT_LINE('An exception happens,the file is closed!'); 
  else 
  dbms_output.put_line('An exception happens!') ; 
  end if; 
   
  END; 
   
  ------------------------------------------------- 
  ----------------------在C++Builder中使用從數據庫中取得剛才創建的數據庫中的圖像------------------------------------ 
   
  void __fastcall TForm1::Button1Click(TObject *Sender) 
  { 
   
  ADOQuery1->Close();
                          
  ADOQuery1->SQL->Clear(); 
  ADOQuery1->SQL->Add(Memo1->Lines->Text); 
  ADOQuery1->Open(); 
   
  if (ADOQuery1->FieldByName("name")->AsString=="pic1") 
  DBImage1->DataField="PICTURE_BLOB"; 
  else 
  { 
   
  //1.創建用于存放Blob大對象的臨時字段,并初始化為從數據庫中取得的圖形 
  TBlobField *pField = (TBlobField *)ADOQuery1->FieldByName("picture_blob"); 
   
  //2.創建一個BlobStream流,以流的形式讀取圖形數據 
  TADOBlobStream *pmem = new TADOBlobStream(pField,bmRead); 
   
  //3. 將流指針放在流的頭部 
  pmem->Seek(0,soFromBeginning); 
   
  //4. 新建一個JPEG對象 
  TJPEGImage * jp = new TJPEGImage(); 
   
  //5. 將放在BlobStream流中的圖形信息讀入jpeg對象 
  jp->LoadFromStream(pmem); 
   
  //6. 將jpeg圖像放在Image控件的picture組件的Graphic內,顯示出來 
  Image1->Picture->Graphic=jp; 
   
  //7. 釋放BlobStream流 
   
  delete pmem; 
   
  } 
   
  }