摘要:本文通過例項介紹了在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欄位實現了該功...