隨著社會的發展,在現代資訊系統的開發中,需要儲存的已不僅僅是簡單的文字資訊,同時還包括一些和音像資料或者是超長的文字。比如開發一套旅遊資訊系統,每乙個景點都有豐富的、音像資料和大量的文字介紹。這就要求後台資料庫要有儲存這些資料的能力。oracle公司在其oracle8i中通過提供lob欄位實現了該功能。
為了便於讀者的理解,我們先介紹一些基本的概念:
為了方便下文的敘述,我們假定使用如下語句在資料庫中建立了一張表。
create table view_sites_info(
site_id number(3),
audio blob default empty_blob(),
document clob default empty_clob(),
video_file bfile default 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_info blob;
bengin
select audio into audio_info from view_sites_info
where site_id=100;
end;
/ 儲存在audio_info變數中的就是lob定位器,而不是lob的值。而要對某一lob的值進行訪問和維護操作,必需通過其定位器來進行。dbms_lob包中提供的所有函式和過程都以lob定位器作為引數。
下面我們以最為常用的讀和寫為例詳細介紹這些過程的用法。
首先介紹一下寫過程。該過程的語法為:
procedure write (
lob_loc in out blob,
amount in binary_integer,
offset in integer,
buffer in raw);
procedure write (
lob_loc in out clob character set any_cs,
amount in binary_integer,
offset in integer,
buffer in varchar2 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 -- 獲取定位器並鎖定行
from view_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_loc in blob,
amount in out binary_integer,
offset in integer,
buffer out raw);
procedure read (
lob_loc in clob character set any_cs,
amount in out binary_integer,
offset in integer,
buffer out varchar2 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;
/**執行完畢後,將輸出如下資訊:
is
Oracle中的LOB欄位解讀
lob欄位是oracle資料庫用於儲存大資料物件的字段型別,包括blob clob nlob bfile 當lob欄位大小超過4k時,資料庫會單獨為該lob欄位分配額外的blob segments儲存blob物件,儲存在lobsegment中的lob預設不在緩衝區快取,對於lob的讀寫都是物理io,...
Oracle 使用外部表匯入含有LOB欄位的資料
假設,你需要將某個路徑下的全部檔案txt檔案匯入資料庫,並保留對應的檔名。外部檔案中lob欄位的位置,應該存放檔名。for n in ls txt do echo n n done test load.txt 兩邊不要留空,否則外部表讀取檔案時會報錯,說找不到該檔案 cat test.txt q10...
jdbc操縱Oracle資料庫lob欄位
在oracle資料庫中,lob large object,大型物件 型別的字段使用的頻率越來越高了。因為這種型別的字段,容量大 最多能容納4gb的資料 且乙個表中可以有多個這種型別的字段,很靈活,適用於資料量非常大的業務領域 如圖象 檔案等 而long long raw等型別的字段,雖然儲存容量也不...