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