DBMS LOB包使用和維護

2021-04-12 20:48:18 字數 3982 閱讀 8848

摘要:本文通過例項介紹了在oracle資料庫中通過dbms_lob包使用和維護lob資料型別的基本方法。  

中圖分類號:tp31  

1、引言  

隨著社會的發展,在現代資訊系統的開發中,需要儲存的已不僅僅是簡單的文字資訊,同時還包括一些和音像資料或者是超長的文字。比如開發一套旅遊資訊系統,每乙個景點都有豐富的、音像資料和大量的文字介紹。這就要求後台資料庫要有儲存這些資料的能力。oracle公司在其oracle8i中通過提供lob欄位實現了該功能。  

為了便於讀者的理解,我們先介紹一些基本的概念:  

為了方便下文的敘述,我們假定使用如下語句在資料庫中建立了一張表。  

create   table   view_sites_info    

(   site_idnumber(3),    

audioblobdefault   empty_blob(),    

documentclobdefault   empty_clob(),    

video_filebfiledefault   null,    

constraint   pk_tab_view_sites_info   primary   key   (site_id)    

);    

2、lob的使用和維護  

oracl提供了多種使用和維護lob的方式,如使用pl/sql   dbms_lob包、呼叫oci(oracle   call   inte***ce)、使用proc   *   c/c++、使用jdbc等。其中最為方便有效的是使用pl/sql呼叫dbms_lob包,本文就將介紹該方法。  

在oracle中,儲存在lob中資料稱為lob的值,如使用select   對某一lob欄位進行選擇,則返回的不是lob的值,而是該lob欄位的定位器(可以理解為指向lob值的指標)。如執行如下的sql語句:  

delcare    

audio_infoblob;  

bengin    

select   audio   into   audio_info   from   view_sites_info    

where   site_id=100;    

end;    

/    

儲存在audio_info變數中的就是lob定位器,而不是lob的值。而要對某一lob的值進行訪問和維護操作,必需通過其定位器來進行。dbms_lob包中提供的所有函式和過程都以lob定位器作為引數。  

2.1內部lob  

dbms_lob包中主要提供了以下幾個過程供使用者對內部lob欄位進行維護。  

copy()從源lob中複製資料到目的lob    

erase()刪除lob中全部或部分內容  

trim()將lob值減少到指定的長度  

write()向lob   中寫入資料  

compare()比較兩個同種資料型別的lob的部分或全部值是否相同  

getlength()獲取lob的長度  

read()從lob中讀出資料  

下面我們以最為常用的讀和寫為例詳細介紹這些過程的用法。  

首先介紹一下寫過程。該過程的語法為:  

procedure   write   (    

lob_locin   outblob,    

amountinbinary_integer,    

offsetininteger,    

bufferinraw);    

procedure   write   (    

lob_locin   outclobcharacter   set   any_cs,    

amountinbinary_integer,    

offsetininteger,    

bufferinvarchar2   character   set   lob_loc%charset);    

各引數的含義為:  

lob_loc:要寫入的lob定位器  

amount:寫入lob中的位元組數  

offset:指定開始操作的偏移量  

buffer:指定寫操作的緩衝區  

下面的**就是運用該過程向lob欄位寫入資料的示例。  

declare    

lobloc   clob;    

buffer   varchar2(2000);    

amount   number   :=   20;    

offset   number   :=   1;    

begin    

--初始化要寫入的資料  

buffer   :=   'this   is   a   writing   example';    

amount   :=   length(buffer);    

select   document   into   lobloc--   獲取定位器並鎖定行  

fromview_sites_info    

where   site_id   =   100   for   update;    

dbms_lob.write(lobloc,amount,1,buffer);    

commit;    

end;    

/    

需要特別指出的是:  

i.在呼叫寫過程前一定要使用select語句檢索到定位器且用   for   update   子句鎖定行,否則不能更新lob;  

ii.寫過程從offset指定的位置開始,向lob中寫入長度為amount的資料,原lob中在這個範圍內的任何資料都將被覆蓋。  

iii.緩衝區的最大容量為32767位元組,因此在寫入大量資料時需多次呼叫該過程。  

下面再來介紹一下讀過程:  

該過程的語法為:  

procedure   read   (    

lob_locinblob,    

amountin   outbinary_integer,    

offsetininteger,    

bufferoutraw);    

procedure   read   (    

lob_locinclobcharacter   set   any_cs,    

amountin   outbinary_integer,    

offsetininteger,    

bufferoutvarchar2   character   set   lob_loc%charset);    

各引數的含義為:  

lob_loc:要讀取的lob定位器  

amount:要讀取的位元組數  

offset:開始讀取操作的偏移量  

buffer:儲存讀操作結果的緩衝區  

下面的**演示了如何使用該過程讀取lob欄位中的資料:  

declare    

lobloc   clob;    

buffer   varchar2(2000);    

amount   number   :=   2;    

offset   number   :=   6;    

begin    

select   document   into   lobloc--獲取定位器  

from   lob_store    

where   lob_id   =   100;    

dbms_lob.read(lobloc,amount,offset,buffer);--讀取資料到緩衝區  

dbms_output.put_line(buffer);--顯示緩衝區中的資料  

commit;    

end;    

/   

動態維護凸包

依次插入n個點,詢問凸包面積。利用granham思想,維護凸包,水平序要維護兩個凸殼,比較麻煩,所以用極角序,每次查入用平衡樹維護極角離他最近的點,此時到雙向鍊錶上開始模擬granham雙向刪點,直到無法刪為止,因為每個點至多刪一次,所以是nlogn的複雜度。面積維護用叉積即時維護即可。依次插入n個...

登錄檔的使用和維護

登錄檔是乙個樹狀分層資料庫,有六個根鍵 主關鍵字 1.hkey classes root 已經註冊的副檔名 檔案型別 檔案圖示等 2.hkey current user 包含當前使用者的登入資訊和配置資訊 3.hkey local machine 該根鍵包含本地計算機 相對網路環境而言 的硬體和軟體...

ORACLE中LOB欄位的使用和維護

隨著社會的發展,在現代資訊系統的開發中,需要儲存的已不僅僅是簡單的文字資訊,同時還包括一些和音像資料或者是超長的文字。比如開發一套旅遊資訊系統,每乙個景點都有豐富的 音像資料和大量的文字介紹。這就要求後台資料庫要有儲存這些資料的能力。oracle公司在其oracle8i中通過提供lob欄位實現了該功...