正在看的ORACLE教程是:Oracle数据库处理多媒体信息。
引文: 长期以来,多媒体信息在计算机中都是以文件形式存放,由操作系统管理的,但是随着计算机网络,分布式计算的发展,对多媒体信息进行高效的管理,存取,查询已经成了一种迫切需求。而关系数据库却有着强大的数据管理能力。两方面结合,多媒体数据库由此应运而生。本文将就Oracle对多媒体信息进行处理的方式,工具,特色以及一些基本原理做一个综述。 但是我们不能不遗憾的看到,现有数据库对一些多媒体数据所特有的操作能力还是很有限的。针对多媒体数据库的性能调优现在也遇到了新的问题。虽然如此,多媒体数据库仍旧产生了广阔的应用价值和前景。
当然本文不可能面面俱到,有关Oracle多媒体信息处理的具体内容,请查阅Oracle相关手册。 一.应用前景综述 随着计算机处理能力的大副提高,多媒体早已经融入到了计算机当中了,如果缺少了多媒体,缺少了各种多姿多采的图象,音频,视频,很难想象计算机如今会走入千家万户。长期以来,多媒体信息在计算机中都是以文件形式存放,由操作系统管理的,但是随着计算机网络,分布式计算的发展,这种单纯的文件式管理已经力不从心了,对多媒体信息进行高效的管理,存取,查询已经成了一种迫切需求。而关系数据库却有着强大的数据管理能力。两方面密切结合,多媒体数据库由此应运而生。可以预见,随着多媒体处理需求的加强,多媒体数据库的应用将越来越广泛。 Oracle作为一家著名的数据库厂商,在多媒体信息处理上,更是走在了前边。本文将就Oracle对多媒体信息进行处理的方式,工具,特色以及一些基本原理做一个综述。希望对读者有所启发。当然,关系数据库还有好多家,虽然开发工具,编程接口语句各异,但在数据类型、处理方式上比较相似。所以我们在此略过。 二.多媒体数据类型介绍 在关系型数据库中,多媒体信息等大型对象是由lob型字段来进行存取的。在Oracle8i中,正式引入了此标准,以适应多媒体大对象处理的需求。Oracle数据库中,lob型数据有以下几种: -------------------------------------------- Lob类型说明 Clob:和Oracle7的long型相似,clob可以存储单字节型数据 Nclob:Nclob存储定宽的多字节国家字符集数据 Blob:和Oracle7中的longraw类型相似。可以存储无结构的二进制数据。Oracle8没有对这种数据进行解释,只是按照原来的形式存储和检索它。 Bfile:Bfile允许对Oracle数据库以外存储的大型二进制文件进行只读形式的访问。和其它三种lob类型数据不同的是,bfile类型数据存储在一个单独的文件中,该文件不由Oracle来维护。 特点: 1.在Oracle7中,相应的long或longraw字段有2g的限制,而lob的限制是4g。 2.lob可以使用调用接口OCI或者由pl/sql利用dbms_lob包进行操纵。 3.lob不象long型那样每个表中最多只有一个字段的限制,其可以有多个,而又可以利用触发器的特性。 4.lob数据处理可以获得与其它数据同样的事物特性。 5.lob的存储比较特殊,它并不是跟其他数据存储在同一个数据库表中,而是可以单独存放于不同的表空间中,由一个定位符指向实际的lob数据。
[NextPage] 三.多媒体大对象存取例程举例 按照如下步骤来完成各个操作: (1)先建立一个数据库表: createtablelobdemo(keyNUMBERKEY,clob_colCLOB,blob_colBLOB,bifle_colBFILE); 这个数据库第一列存储一个码,另外三列存储lob型数据。 (2)表建好以后,往表中插入一条数据: insertintolobdemo(key,clob_col,blob_col,bfile_col)values(10,'abcdefghijklmnopqrsatuvwxyzasdffasfsdafsdafsdfadfsadfsdfsdfdsdsffds',empty_blob(),null); 在这一条数据中,第二列我们插入一个字符串,它被格式化为clob类型数据进行存储;第二列我们使用empty_blob()函数来初始化一个定位符,以后就可以获取这个定位符进行比如select,update等操作了;第三列赋空值,它并没有获得一个定位符,这是与empty_blob()函数的区别。 (3)查询插入表中的数据 selectblob_colfromboldemowherekey=20; 注意:这一sql语句的返回结果是一个定位符(locator),而不是实际的数据本身。 (4)修改数据库中数据 updatelobdemoSETblob_col='aedevbagddgagdfdfasasdfdsa'wherekey=10; 从这些sql语句当中,我们看到了lob型数据处理的基本方法,发现与其他类型数据处理相似。但是sql语句中lob型数据处理的特殊性在于以下方面: (1)bfile文件的处理: bfile类型有着特殊性,跟clob,blob不同。实际的数据文件存储在操作系统的外面:所以有两个特点:1.没有事务性控制2.bfile是只读的,不能用dbms_lob或oracl8oci进行修改。让我们来看对bfile的操作步骤: <1>为了访问外部文件,服务器需要知道文件在操作系统中的位置。下面我们建立一个目录:
createDIRECTORYutilsAS'/home/utils';
utils表示目录逻辑名,'/home/utils'是实际目录。 <2>使用bfilename函数插入一行数据: insertintolobdemo(key,bfile_col)values(-1,biflename('utils','file1')); bfilename函数的第一个参数是逻辑目录名,第二个参数是文件名。注意:这一行中插入的是一个指向/home/utils/file1的lob定位符,并不是文件本身。 (2)利用dbms_lob包进行lob数据操作 sql仅可以操纵整个lob,而不能操纵数据片。dbms_lob包则放开了这个限制,它提供对lob数据中数据片的操作。这个包中包含十几个例程,读者可以查阅Oraclepl/sql手册,本文只介绍三个函数:fileopen()用来打开一个操作系统文件;loadfromfile()例程用来往目标lob字段填充一个操作系统文件,这个函数很有实用价值,因为有许多lob内容在sql语句中是不可描述的,例如一个二进制音频文件,而用这个函数可以将文件内容导入到数据库;getlength函数计算文件的长度。请看下面一个存储过程中这三个函数的使用: createorreplaceprocedureFileExec(
p_DirectoryinVARCHAR2,
p_FilenameINVARCHAR2
)AS
v_FileLocatorBFILE;
v_CLOBLocatorCLOB;
BEGIN
--为update初始化一个定位符
SELECTclob_col
INTOv_CLOBLocator
FROMlobdemo
WHEREkey=-1
FORUPDATE; --为读文件初始化一个BFILE定位符 v
songIdVARCHAR2(20),--歌曲号
titleVARCHAR2(4000),--题目
artistVARCHAR2(4000),--作家
awardsVARCHAR2(4000),--奖项
timePeriodVARCHAR2(20),--日期时间
txtinroductionCLOB,--简介
audioSourceORDSYS.ORDAUdio--音频数据,这个字段由ORDAUdio对象来定义。
); (2)建立一个名为songtable的表: CREATETABLESongsTableofsongObject(UNIQUE(songId),songIdNOTNULL); (3)插入一行数据到SongsTable表中 INSERTINTOSongsTableVALUES('00',
'UnderPressure',
'Queen',
'noawards',
'80-90',
243,
NULL,
EMPTY_CLOB(),
ORDSYS.ORDAudio(NULL,
ORDSYS.ORDSource(EMPTY_BLOB(),NULL,NULL),EMPTY_CLOB(),NULL));
注意:。EMPTY_CLOB,EMPTY_BLOB()函数只是初始化一个lob数据定位符,而没有存储实际的数据。 (4)向SongsTable表中载入一行数据: DECLARE
audioObjORDSYS.ORDAUdio;
ctxRAW(4000):=NULL;
BEGIN --取得audioSource字段定位符 SELECTS.audioSourceINTOaudioObj FROMSongsTableS
WHERES.songId='00'
FORUPDATE; --下面的四个函数是ORDAUdio对象的成员函数,具体功能请查看Oracle开发手册 audioObj.setSource('FILE','AUDDIR','UnderPressure.au');--设定文件 audioObj.setMimeType('audio/basic');--设定类型 audioObj.import(ctx);--载入ctx audioObj.setProperties(ctx);--设置属性 --将歌曲对象载入到数据库表中 UPDATESongsTableS
SETS.audioSource=audioObj
WHERES.songId='00'; COMMIT; END;
[NextPage] 五.多媒体<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>技术难点与展望 可以说,多媒体数据的高效管理是IT技术发展的必然要求,随着多媒体信息需求的进一步加强,多媒体<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>技术将会有更大的发展,从Oracle<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>中我们可以看出,无论在数据类型,数据管理,还是开发管理工具上,现在的主流关系<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>已经具有很强的多媒体信息管理能力。但是我们不能不遗憾的看到,对一些多媒体数据所特有的操作(比如对多媒体信息的<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>)能力还是很有限的。 一个问题就是多媒体数据的特殊操作实现,因为lob型数据是二进制的大对象,他不能简单的按照一般数据的操作符来进行计算。比如,要查出一个数据表中与某首歌相似的音频。那么对于这个'相似'操作来说,它得不到传统的操作符的<a href="/tag/zhichi/" target="_blank" class="keywords">支持</a>,而且它将涉及很复杂的算法。可喜的是,Oracle9iIntermedia已经具有多媒体数据的<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>与匹配<a href="/tag/gongneng/" target="_blank" class="keywords">功能</a>,例如,可以从质地(texture),形状,颜色,颜色分量等要素进行相似图象的<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>,在<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>时可以设置各个要素的权值,测试的结果还是差强人意的。但是对au<a href="/tag/dio/" target="_blank" class="keywords">dio</a>,video等类型数据的<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>仍然不够理想。 另外,如何描述多媒体信息,怎样根据你对多媒体信息的描述来检索,也是一个难点问题,比如这个<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>任务:<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>出颜色比较暗的并且有森林的风景照片,这就是根据描述性信息进行<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>的例子。这将需要某种行业标准和技术实现。总之,如何实现和优化针对多媒体数据的特殊操作(如相似<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>等),将是以后多媒体<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>研究和应用中的热点问题。 另外一个重要的问题就是针对多媒体<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>的<a href="/tag/xingneng/" target="_blank" class="keywords">性能</a>调优,原先的调优<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>如索引优化等仍然适用,但是现在遇到了新的问题:多媒体数据是庞大的,那么对多媒体信息的操作(尤其是检索)开销巨大,那么如何降低这种开销,缩短操作时间,又是一个重要课题。 <BR></P></p><p align='center'><b><a href="/tag/shangyiye/" target="_blank" class="keywords">上一页</a></b></p>
</p><p align='center'><b><a href='/shujuku/ORACLE/shujuku_2024.html'>上一页</a><a href='/shujuku/ORACLE/shujuku_2024.html'>[1]</a>[2]</b></p>