1. 程式人生 > >oracle對BLOB型別資料的操作與效能問題

oracle對BLOB型別資料的操作與效能問題

Oracle的Blob欄位比較特殊,他比long欄位的效能要好很多,可以用來儲存例如圖片之類的二進位制資料。
寫入Blob欄位和寫入其它型別欄位的方式非常不同,因為Blob自身有一個cursor,你必須使用cursor對blob進行操作,因而你在寫入Blob之前,必須獲得cursor才能進行寫入,那麼如何獲得Blob的cursor呢?
這需要你先插入一個empty的blob,這將建立一個blob的cursor,然後你再把這個empty的blob的cursor用select查詢出來,這樣通過兩步操作,你就獲得了blob的cursor,可以真正的寫入blob資料了。
舉例如下:
Oracle系列:LOB大物件處理
 

主要是用來儲存大量資料的資料庫欄位,最大可以儲存4G位元組的非結構化資料。
 主要介紹字元型別和二進位制檔案型別LOB資料的儲存,單獨介紹二進位制型別LOB資料的儲存。
 
一,Oracle中的LOB資料型別分類
 1,按儲存資料的型別分:
  ①字元型別:
   CLOB:儲存大量 單位元組 字元資料。
   NLOB:儲存定寬 多位元組 字元資料。
  ②二進位制型別:
   BLOB:儲存較大無結構的二進位制資料。
  ③二進位制檔案型別:
  BFILE:將二進位制檔案儲存在資料庫外部的作業系統檔案中。存放檔案路徑。
 
 2,按儲存方式分:
   ①儲存在內部表空間:
   CLOB,NLOB和BLOB
   ②指向外部作業系統檔案:
    BFILE
 
二,大物件資料的錄入
 1,宣告LOB型別列
 
  Create Table tLob (
    no Number(4),
    name VarChar2(10),
    resume CLob,
    photo BLob,
    record BFile
    )
  Lob (resume,photo)Store As (
   Tablespacets5_21  --指定儲存的表空間
   Chunk 6k --指定資料塊大小
   Disable Storage In Row
  );
 2,插入大物件列
  ①先插入普通列資料
 
  ②遇到大物件列時,插入空白建構函式。
  字元型:empty_clob(),empty_nclob()
   二進位制型:empty_blob()
  二進位制檔案型別:BFileName函式指向外部檔案。
    BFileName函式:
     BFileName(‘邏輯目錄名’,‘檔名’);
     邏輯目錄名只能大寫,因為資料詞典是以大寫方式儲存。Oracle是區分大小寫的。
     在建立時,無需將BFileName函式邏輯目錄指向物理路徑,使用時才做檢查二者是否關聯。
   例子:
   Insert Into tLobValues(1,'Gene',empty_clob(),empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
  
  ③將邏輯目錄和物理目錄關聯。(如果是二進位制檔案型別)
   授予 CREATE ANY DIRECTORY許可權
   Grant  CREATE ANY DIRECTORY  TO使用者名稱 WITH ADMIN OPTION;
   關聯邏輯目錄和物理目錄
    本地
    CreateDirectory  邏輯目錄名 As  ‘檔案的物理目錄’;
    網路:
    CreateDirectory  邏輯目錄名 As  ‘\\主機名(IP)\共享目錄’;
   例子:
    CreateDirectory  MYDIR As 'E:\Oracle';
 
  插入例子:
  insert into tlobvalues(1,'Gene','CLOB大物件列',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
 
三,大物件資料的讀取和操作:DBMS_LOB包
  DBMS_LOB包:包含處理大物件的過程和函式
 
  1,讀取大物件資料的過程和函式
  ①:DBMS_LOB.Read():從LOB資料中讀取指定長度資料到緩衝區的過程。
    DBMS_LOB.Read(LOB資料,指定長度,起始位置,儲存返回LOB型別值變數);
    例子:
   Declare
      varC clob;
     vRStr  varchar2(1000);
      ln number(4);
      Strt number(4);
    Begin
      select resume into varC from tlob where no = 1;
      ln := DBMS_LOB.GetLength(varC);
      Strt := 1;
      DBMS_LOB.Read(varC, ln, Strt, vRStr);
      DBMS_output.put_line('Return:  '||vRStr);
    End;
 
  ②:DBMS_LOB.SubStr():從LOB資料中提取子字串的函式。
    DBMS_LOB.SubStr(LOB資料,指定提取長度,提取起始位置):
    例子:
   Declare
     varC clob;
      vRStr  varchar2(1000);
      ln number(4);
      Strt number(4);