王霞 闫爱平 李娜
摘 要 随着计算机应用系统的广泛应用,应该系统的数据库越来越大,可以存储或应用的数据类型也越来越多。大对象数据作为普通数据类型的补充可以帮助我们解决很多现实问题。但大对象数据的存储和读取却是困扰数据库设计师的难题,通常会使用高级语言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