董婧
摘要:在進(jìn)行數(shù)據(jù)庫設(shè)計時,通常需要保存圖片、視頻等非結(jié)構(gòu)化信息,采用LOB對象進(jìn)行存儲訪問具有效率高、安全性好等優(yōu)點(diǎn)。
關(guān)鍵詞:Oracle;非結(jié)構(gòu)化數(shù)據(jù);LOB;dbms_lob包
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)21-0006-01
1引言
數(shù)據(jù)庫管理系統(tǒng)的應(yīng)用范圍越來越廣泛,隨著對所需要存儲信息的復(fù)雜度和多樣化的需求越來越高,諸如圖片、音視頻文件、電子文檔、網(wǎng)頁、電子郵件等非結(jié)構(gòu)化數(shù)據(jù)也要求以數(shù)據(jù)庫方式來進(jìn)行存儲。而實(shí)際在存儲這些信息時,多采用文件管理系統(tǒng)方式將數(shù)據(jù)存儲在目錄結(jié)構(gòu)中,只將文件的文件名信息和路徑保存在數(shù)據(jù)庫中,沒有真正實(shí)現(xiàn)采用數(shù)據(jù)庫方式存儲。該方式實(shí)現(xiàn)起來比較簡單,但是沒有達(dá)到數(shù)據(jù)的完整性和一致性要求,文件容易被誤操作,安全性不高。從數(shù)據(jù)的可管理性和安全性角度考慮,應(yīng)該將這些非結(jié)構(gòu)化數(shù)據(jù)集中存儲在數(shù)據(jù)庫中,達(dá)到安全高效的管理目的。在數(shù)據(jù)庫中,諸如此類復(fù)雜的非結(jié)構(gòu)化數(shù)據(jù)統(tǒng)稱為大對象數(shù)據(jù)LOB(LargeObjects)[1]。由于LOB比常見的一些數(shù)據(jù)類型復(fù)雜度高,它是長度可變的二進(jìn)制流或字節(jié)流,數(shù)據(jù)的存儲和顯示方法不能夠像其他常用的數(shù)據(jù)類型一樣,按照常規(guī)的處理方式不能實(shí)現(xiàn),比較特殊,因此如何對大對象數(shù)據(jù)存儲和管理顯得至關(guān)重要。
2 大對象類型數(shù)據(jù)
LOB數(shù)據(jù)類型專門用于存儲包括電子文檔、多媒體、電子郵件、網(wǎng)頁甚至空間數(shù)據(jù)等大對象的數(shù)據(jù),一般不大于4G字節(jié)。Oracle8之前使用LONG、LOBG RAW來實(shí)現(xiàn),現(xiàn)慢慢淘汰,Oracle8開始使用LOB實(shí)現(xiàn)。在Oracle中,有4個大對象(LOBS)類型可用,分別是CLOB、BLOB、NCOLB、BFILE[2],分為內(nèi)部LOB和外部LOB。內(nèi)部LOB包括CLOB、BLOB、NCOLB;外部LOB包括BFILE。BLOB即Binary Large Object,以二進(jìn)制數(shù)據(jù)形式存儲在數(shù)據(jù)庫中,最大存儲容量4GB。CLOB即Character Large Object,是一種字符數(shù)據(jù),存儲在數(shù)據(jù)庫中,最大存儲容量4GB。BFILE即Binary File,是一種只讀型二進(jìn)制數(shù)據(jù),存貯在數(shù)據(jù)庫之外,字段中存儲的是文件定位指針.bfile。在Oracle中是只讀的,用于將非結(jié)構(gòu)化數(shù)據(jù)存儲在數(shù)據(jù)庫之外的操作系統(tǒng)文件中,最大長度由操作系統(tǒng)限制。NCOLB是基于國家語言字符集的數(shù)據(jù)類型,用于存儲數(shù)據(jù)庫中的固定寬度單字節(jié),也可存儲多字節(jié)類型的大型數(shù)據(jù)快,最大存儲容量也為4GB。
3 在Oracle中處理LOB數(shù)據(jù)類型
Oracle中可以用多種方法對LOB型數(shù)據(jù)進(jìn)行查詢訪問和增、刪、改等操作,比如使用dbms_lob包、調(diào)用Oracle Call Interface和使用JDBC等。一般常用的比較簡單的也是方便有效的處理方法是使用PL/SQLdbms_lob包[3-4]。dbms_lob包提供了讀取大對象數(shù)據(jù)的過程和函數(shù),功能強(qiáng)大。既可以用來讀取內(nèi)部的LOB對象,也可以用來處理BFILE對象。這里只列出常用的一些函數(shù),如DBMS_LOB.read()用于從LOB數(shù)據(jù)中讀取指定長度數(shù)據(jù)到緩沖區(qū);DBMS_LOB.substr()函數(shù)用于從LOB數(shù)據(jù)中提取子字符串;DBMS_LOB.getlength()函數(shù)用于返回指定LOB數(shù)據(jù)的長度;DBMS_LOB.append()用于將指定的LOB數(shù)據(jù)追加到指定的LOB數(shù)據(jù)后;DBMS_LOB.write()用于將指定數(shù)量的數(shù)據(jù)寫入LOB;DBMS_LOB.erase()用于刪除LOB數(shù)據(jù)中指定位置的部分?jǐn)?shù)據(jù);DBMS_LOB.copy()用于從指定位置開始將源LOB復(fù)制到目標(biāo)LOB,通過這些提供的過程和函數(shù)可以很方便地操作LOB對象。
4 存儲訪問實(shí)例
下面是向Oracle中存儲一張圖片的實(shí)例:
Grantcreate any directory to scott;
//為scott用戶授權(quán)
CREATE OR REPLACE DIRECTORY IMAGES AS D:\picture;
//創(chuàng)建存儲圖片的目錄
CREATE TABLE IMAGE_LOB (
T_ID VARCHAR2 (5) NOT NULL,
T_IMAGE BLOB NOT NULL);
//創(chuàng)建存儲圖片的表
CREATE PROCEDURE IMG_INSERT (
TID VARCHAR2,
FILENAME VARCHAR2) AS F_LOB BFILE;--文件類型
B_LOB BLOB;
BEGIN
INSERT INTO IMAGE_LOB (T_ID, T_IMAGE)
VALUES (TID,EMPTY_BLOB ()) RETURN T_IMAGE INTO B_LOB;
F_LOB:= BFILENAME (IMAGES, FILENAME);
DBMS_LOB.FILEOPEN(F_LOB, DBMS_LOB.FILE_READONLY);
DBMS_LOB.LOADFROMFILE (B_LOB, F_LOB,DBMS_LOB.GETLENGTH (F_LOB));
DBMS_LOB.FILECLOSE (F_LOB);
COMMIT;
END;
//創(chuàng)建存儲圖片的存儲過程
Call IMG_INSERT (1,hello.jpg);
//在D:\picture目錄下存放一張圖片hello.jpg之后,將該圖片存入表
經(jīng)過測試,使用該存儲過程存儲訪問以LOB對象方式存儲的圖片查詢速度快,效率高,是一個不錯的選擇。
5結(jié)束語
文中研究了在Oracle數(shù)據(jù)庫管理系統(tǒng)中對大對象數(shù)據(jù)的存儲與訪問技術(shù)。通過LOB對象可以實(shí)現(xiàn)對數(shù)據(jù)庫中二進(jìn)制數(shù)據(jù)的存儲與讀取,實(shí)驗(yàn)證明利用該方式管理圖像、音視頻等非結(jié)構(gòu)化數(shù)據(jù)具有較高的效率和較好的安全性。
參考文獻(xiàn):
[1]王珊.數(shù)據(jù)庫系統(tǒng)概論[M]. 第4版.北京:高等教育出版社,2006.
[2]王傳勝, 張凌燕.信息集成中大對象的研究與實(shí)現(xiàn)[J] .微計算機(jī)信息, 2009(18):107-108.
[3]李曉黎, 劉宗堯.Oracle10g數(shù)據(jù)庫管理與應(yīng)用系統(tǒng)開發(fā)[M].北京:人民郵電出版社, 2007.
[4]蓋國強(qiáng).循序漸進(jìn)Oracle——數(shù)據(jù)庫管理、優(yōu)化與備份恢復(fù)[M].北京:人民郵電出版社, 2008.