国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

大對象數(shù)據(jù)的存取在Oracle數(shù)據(jù)庫中的設(shè)計(jì)與實(shí)現(xiàn)

2015-04-20 18:10:15王霞閆愛平李娜
電子技術(shù)與軟件工程 2015年6期

王霞 閆愛平 李娜

摘 要 隨著計(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

东光县| 崇信县| 冷水江市| 开远市| 麟游县| 潮州市| 晋州市| 内乡县| 花莲县| 万安县| 文安县| 林口县| 海晏县| 龙游县| 寻乌县| 衡阳县| 沙洋县| 东山县| 桂平市| 铜川市| 白玉县| 资兴市| 屏南县| 宣化县| 读书| 依安县| 廊坊市| 宝丰县| 东海县| 萨迦县| 涿鹿县| 广东省| 麻栗坡县| 武夷山市| 吐鲁番市| 光山县| 青龙| 吴忠市| 奎屯市| 中卫市| 万源市|