ORACLE中LOB欄位的使用和維護

2021-04-21 12:03:45 字數 3116 閱讀 4762

隨著社會的發展,在現代資訊系統的開發中,需要儲存的已不僅僅是簡單的文字資訊,同時還包括一些和音像資料或者是超長的文字。比如開發一套旅遊資訊系統,每乙個景點都有豐富的、音像資料和大量的文字介紹。這就要求後台資料庫要有儲存這些資料的能力。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等型別的字段,雖然儲存容量也不...