APP下载

Oracle中LOB对象存储访问研究

2016-10-18董婧

电脑知识与技术 2016年21期

董婧

摘要:在进行数据库设计时,通常需要保存图片、视频等非结构化信息,采用LOB对象进行存储访问具有效率高、安全性好等优点。

关键词:Oracle;非结构化数据;LOB;dbms_lob包

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2016)21-0006-01

1引言

数据库管理系统的应用范围越来越广泛,随着对所需要存储信息的复杂度和多样化的需求越来越高,诸如图片、音视频文件、电子文档、网页、电子邮件等非结构化数据也要求以数据库方式来进行存储。而实际在存储这些信息时,多采用文件管理系统方式将数据存储在目录结构中,只将文件的文件名信息和路径保存在数据库中,没有真正实现采用数据库方式存储。该方式实现起来比较简单,但是没有达到数据的完整性和一致性要求,文件容易被误操作,安全性不高。从数据的可管理性和安全性角度考虑,应该将这些非结构化数据集中存储在数据库中,达到安全高效的管理目的。在数据库中,诸如此类复杂的非结构化数据统称为大对象数据LOB(LargeObjects)[1]。由于LOB比常见的一些数据类型复杂度高,它是长度可变的二进制流或字节流,数据的存储和显示方法不能够像其他常用的数据类型一样,按照常规的处理方式不能实现,比较特殊,因此如何对大对象数据存储和管理显得至关重要。

2 大对象类型数据

LOB数据类型专门用于存储包括电子文档、多媒体、电子邮件、网页甚至空间数据等大对象的数据,一般不大于4G字节。Oracle8之前使用LONG、LOBG RAW来实现,现慢慢淘汰,Oracle8开始使用LOB实现。在Oracle中,有4个大对象(LOBS)类型可用,分别是CLOB、BLOB、NCOLB、BFILE[2],分为内部LOB和外部LOB。内部LOB包括CLOB、BLOB、NCOLB;外部LOB包括BFILE。BLOB即Binary Large Object,以二进制数据形式存储在数据库中,最大存储容量4GB。CLOB即Character Large Object,是一种字符数据,存储在数据库中,最大存储容量4GB。BFILE即Binary File,是一种只读型二进制数据,存贮在数据库之外,字段中存储的是文件定位指针.bfile。在Oracle中是只读的,用于将非结构化数据存储在数据库之外的操作系统文件中,最大长度由操作系统限制。NCOLB是基于国家语言字符集的数据类型,用于存储数据库中的固定宽度单字节,也可存储多字节类型的大型数据快,最大存储容量也为4GB。

3 在Oracle中处理LOB数据类型

Oracle中可以用多种方法对LOB型数据进行查询访问和增、删、改等操作,比如使用dbms_lob包、调用Oracle Call Interface和使用JDBC等。一般常用的比较简单的也是方便有效的处理方法是使用PL/SQLdbms_lob包[3-4]。dbms_lob包提供了读取大对象数据的过程和函数,功能强大。既可以用来读取内部的LOB对象,也可以用来处理BFILE对象。这里只列出常用的一些函数,如DBMS_LOB.read()用于从LOB数据中读取指定长度数据到缓冲区;DBMS_LOB.substr()函数用于从LOB数据中提取子字符串;DBMS_LOB.getlength()函数用于返回指定LOB数据的长度;DBMS_LOB.append()用于将指定的LOB数据追加到指定的LOB数据后;DBMS_LOB.write()用于将指定数量的数据写入LOB;DBMS_LOB.erase()用于删除LOB数据中指定位置的部分数据;DBMS_LOB.copy()用于从指定位置开始将源LOB复制到目标LOB,通过这些提供的过程和函数可以很方便地操作LOB对象。

4 存储访问实例

下面是向Oracle中存储一张图片的实例:

Grantcreate any directory to scott;

//为scott用户授权

CREATE OR REPLACE DIRECTORY IMAGES AS D:\picture;

//创建存储图片的目录

CREATE TABLE IMAGE_LOB (

T_ID VARCHAR2 (5) NOT NULL,

T_IMAGE BLOB NOT NULL);

//创建存储图片的表

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;

//创建存储图片的存储过程

Call IMG_INSERT (1,hello.jpg);

//在D:\picture目录下存放一张图片hello.jpg之后,将该图片存入表

经过测试,使用该存储过程存储访问以LOB对象方式存储的图片查询速度快,效率高,是一个不错的选择。

5结束语

文中研究了在Oracle数据库管理系统中对大对象数据的存储与访问技术。通过LOB对象可以实现对数据库中二进制数据的存储与读取,实验证明利用该方式管理图像、音视频等非结构化数据具有较高的效率和较好的安全性。

参考文献:

[1]王珊.数据库系统概论[M]. 第4版.北京:高等教育出版社,2006.

[2]王传胜, 张凌燕.信息集成中大对象的研究与实现[J] .微计算机信息, 2009(18):107-108.

[3]李晓黎, 刘宗尧.Oracle10g数据库管理与应用系统开发[M].北京:人民邮电出版社, 2007.

[4]盖国强.循序渐进Oracle——数据库管理、优化与备份恢复[M].北京:人民邮电出版社, 2008.