王霞 閆愛平 李娜
摘 要 隨著計(jì)算機(jī)應(yīng)用系統(tǒng)的廣泛應(yīng)用,應(yīng)該系統(tǒng)的數(shù)據(jù)庫越來越大,可以存儲或應(yīng)用的數(shù)據(jù)類型也越來越多。大對象數(shù)據(jù)作為普通數(shù)據(jù)類型的補(bǔ)充可以幫助我們解決很多現(xiàn)實(shí)問題。但大對象數(shù)據(jù)的存儲和讀取卻是困擾數(shù)據(jù)庫設(shè)計(jì)師的難題,通常會使用高級語言JAVA等來實(shí)現(xiàn)Oracle數(shù)據(jù)庫中大對象數(shù)據(jù)。本文試?yán)肞L/SQL存儲過程來實(shí)現(xiàn)Oracle數(shù)據(jù)庫中LOB數(shù)據(jù)的處理,豐富Oracle LOB數(shù)據(jù)庫的技術(shù)理論。
【關(guān)鍵詞】大對象數(shù)據(jù) Oracle LOB PL/SQL
隨著數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)與設(shè)計(jì)的迅速發(fā)展,數(shù)據(jù)庫設(shè)計(jì)師從簡單的整型,備注型向更為復(fù)雜的數(shù)據(jù)類型進(jìn)軍。隨著新的媒介質(zhì)的產(chǎn)生,數(shù)據(jù)庫應(yīng)用系統(tǒng)不單純地能處理文本、日期型數(shù)據(jù)這樣的小對象數(shù)據(jù),更多包含聲音、圖像或視頻等的大對象數(shù)據(jù)應(yīng)用而生。如何設(shè)計(jì)與存取大對象數(shù)據(jù)是困擾每個(gè)軟件設(shè)計(jì)師的難題,如何應(yīng)用這些大對象數(shù)據(jù)是軟件設(shè)計(jì)師急需解決的問題。不同的數(shù)據(jù)庫產(chǎn)品擁有不同的大對象數(shù)據(jù)類型,如SQL Server 數(shù)據(jù)庫產(chǎn)品中就可以用Image來定義大圖片數(shù)據(jù),可以用Text或Ntext來定義大文本字段,這些大對象數(shù)據(jù)通常采用長二進(jìn)制流存儲,方面軟件設(shè)計(jì)師調(diào)用。同樣,Oracle數(shù)據(jù)庫產(chǎn)品中可以用Raw或Blob來定義大對象數(shù)據(jù),這種大對象數(shù)據(jù)采用字符形式存儲。當(dāng)今,大部分的應(yīng)用系統(tǒng)都采用Oracle數(shù)據(jù)庫,如何高效快速的存取大對象數(shù)據(jù),如何存儲大對象數(shù)據(jù)是軟件設(shè)計(jì)師應(yīng)該解決的核心問題,本文試?yán)肞L/SQL存儲過程來解決Oracle數(shù)據(jù)庫中LOB數(shù)據(jù)的處理。
1 大對象數(shù)據(jù)的存儲
數(shù)值型數(shù)據(jù)或其它小對象數(shù)據(jù)都是通過二維表來實(shí)現(xiàn)存儲,將數(shù)據(jù)集成在數(shù)據(jù)表的行中,通過數(shù)據(jù)表的操作來實(shí)現(xiàn)數(shù)據(jù)的存放。大對象數(shù)據(jù)因?yàn)閿?shù)據(jù)量大只能將數(shù)據(jù)塊存儲在存儲設(shè)備上,通過一個(gè)16字節(jié)的指針指向數(shù)據(jù)塊,而16字節(jié)的指針則放在二維數(shù)據(jù)表中,作為一個(gè)小對象數(shù)據(jù)存儲。這個(gè)16字節(jié)的指針指向一個(gè)數(shù)據(jù)塊存儲片段的根節(jié)點(diǎn),可以映射指向該數(shù)據(jù)塊存儲片段的內(nèi)部指針。大對象數(shù)據(jù)的存取時(shí),先讀二維數(shù)據(jù)表中的指針信息,通過指針鏈接讀取專門存儲大對象數(shù)據(jù)的存儲塊。
2 Oracle大對象數(shù)據(jù)類型
Oralce 數(shù)據(jù)庫是由美國甲骨文開發(fā)的一款分布式數(shù)據(jù)庫產(chǎn)品,也是全世界最著名的一款B/S架構(gòu)下的數(shù)據(jù)庫產(chǎn)品之一。Oracle數(shù)據(jù)庫是一款通用性極好的數(shù)據(jù)庫,具備完整的數(shù)據(jù)庫管理功能,是一款完備的關(guān)系數(shù)據(jù)庫,遵循關(guān)系數(shù)據(jù)庫的所有約束,也是一款分布式數(shù)據(jù)庫,能實(shí)現(xiàn)分布式處理數(shù)據(jù)功能。目前市場上普遍采用Oracle Database 12c,該款產(chǎn)品引入了一個(gè)多承租方架構(gòu),可以讓用戶輕松管理數(shù)據(jù)庫云,為未來海量數(shù)據(jù)處理提供方便。
Oracle數(shù)據(jù)庫中總共包括了LONG,LONG RAW和LOB三種大對象數(shù)據(jù)類型。LONG和LONG RAW 是Oracle早期版本就帶有的數(shù)據(jù)類型,最大長度為2G,只支持順序訪問,也不可以作為對象的屬性處理。LOB是Oracle 8i版本后的數(shù)據(jù)類型,該數(shù)據(jù)類型包括內(nèi)部LOB(BLOB CLOB NCLOB)和外部LOB(BFILE),所謂內(nèi)部LOB就是指存放在數(shù)據(jù)中的大對象數(shù)據(jù)類型,所謂外部LOB就是指存放在操作系統(tǒng)中大對象數(shù)據(jù)類型。通常用BLOB來存放像圖像、音頻和視頻等這樣的二進(jìn)制格式數(shù)據(jù);用CLOB來存放像大的文本數(shù)據(jù)這樣的數(shù)據(jù)庫字符集格式字符數(shù)據(jù);用NCLOB來存放像長文本數(shù)據(jù)這樣Unicode字符集字符數(shù)據(jù);用BFILE來存放指向某文本文件或二進(jìn)制文件的操作系統(tǒng)文件指針。
3 Oracle中大對象數(shù)據(jù)的存取方法
3.1 新建測試用表.
CREATE TABLE pic_lob (oratest_ id VARCHAR2 (50) NOT NULL, oratest _pic BLOB NOT NULL)。
為方便大對象數(shù)據(jù)的存取,創(chuàng)建一個(gè)指針文件指向大對象數(shù)據(jù)。
CREATE DIRECTORY PIC AS ‘E:\oraceltest\11; //設(shè)置操作目錄
將操作目標(biāo)設(shè)置好后,將該目錄的讀寫權(quán)限放開,釋放給當(dāng)前數(shù)據(jù)庫用戶。
GRAT WRITE (read) ON DIRECTORY PIC TO SCOTT。
3.2 利用PL/SQL存儲過程實(shí)現(xiàn)大對象數(shù)據(jù)存取
設(shè)計(jì)PL/SQL存儲過程pic_insert,用來存放像圖片,大文本段或視頻等這樣的大對象數(shù)據(jù)。
3.2.1 存入大對象的存儲過程:
CREATE PROCEDURE pic_insert(tid VARCHAR2,filename VARCHAR2) AS bf hfile;
b_ lob BLOB ;
BEGIN
INSERT INTO pic_ lob VALUES (tid,empty_blob()) RETUEN T_pic INTO b_ lob; //插入空的大對象數(shù)據(jù)
Bf:= bfilename ( ‘PIC, filename ); //filname為大對象數(shù)據(jù)的文件名
dbms_lob.fileopen(bf,dbms_lob.file_readonly);
dbms_lob.loadfromfile ( b_lob.bf.dbms_lob.getlength ( bf));
dbms_lob.fileclose(bf);
COMMIT;
END;
3.2.2 讀取的存儲過程
BEGIN
SELECT l_blob
FROM pic_lob
WHERE T_ID=pinm;
l_blob_len:=DBMS_LOB.GETLENGTH(l_blob); //獲取大對象數(shù)據(jù)長度
l_file:=UTL_FILE.FOPEN(‘PIC,ponm,wb,32767);
WHILE l_pos DBMS_LOB.READ(l_blob,l_amount,l_pos,l_buffer); UTL_FILE.PUT_RAW(l_file,l_buffer,TRUE); l_pos:=l_pos+l_amount; END LOOP; UTL_FILE.FCLOSE(l_file); //關(guān)閉文件讀寫 END; 這樣兩個(gè)存儲過程exec pic_insert 和exec pic_read就創(chuàng)建好了,通過執(zhí)行這兩個(gè)存儲過程可以實(shí)現(xiàn)對Oracle數(shù)據(jù)庫中的大對象數(shù)據(jù)存取。 4 結(jié)語 Oracle數(shù)據(jù)庫中的大對象數(shù)據(jù)應(yīng)用是數(shù)據(jù)庫技術(shù)中最關(guān)鍵的技術(shù),通過PL/SQL存儲過程來實(shí)現(xiàn)是最有效也是最簡單的方法,比較容易讓軟件設(shè)計(jì)師掌握。通過實(shí)驗(yàn),該方法性能優(yōu)良,能準(zhǔn)確處理大對象數(shù)據(jù),同時(shí)因?yàn)樵摯髮ο髷?shù)據(jù)支持分布式環(huán)境處理,適合B/S架構(gòu)應(yīng)用軟件的開發(fā)。 參考文獻(xiàn) [1]東庭,孫學(xué)康.使用JDBC數(shù)據(jù)接口存取Oracle LOB(大對象)[J].電腦編程技巧與維護(hù),2005(12):47-49. [2]全杰.基于OCCI技術(shù)存取數(shù)據(jù)庫大對象的方法及實(shí)現(xiàn)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2010(07):98+113. 作者單位 石家莊鐵道大學(xué)四方學(xué)院 河北省石家莊市 051132