Oracle数据库处理多媒体信息
(2001-05-25· 张在建· yesky)
引文: 长期以来,多媒体信息在计算机中都是以文件形式存放,由操作系统管理的,但是随着计算机网络,分布式计算的发展,对多媒体信息进行高效的管理,存取,查询已经成了一种迫切需求。而关系数据库却有着强大的数据管理能力。两方面结合,多媒体数据库由此应运而生。本文将就Oracle对多媒体信息进行处理的方式,工具,特色以及一些基本原理做一个综述。 但是我们不能不遗憾的看到,现有数据库对一些多媒体数据所特有的操作能力还是很有限的。针对多媒体数据库的性能调优现在也遇到了新的问题。虽然如此,多媒体数据库仍旧产生了广阔的应用价值和前景。当然本文不可能面面俱到,有关Oracle多媒体信息处理的具体内容,请查阅Oracle相关手册。 一.应用前景综述 随着计算机处理能力的大副提高,多媒体早已经融入到了计算机当中了,如果缺少了多媒体,缺少了各种多姿多采的图象,音频,视频,很难想象计算机如今会走入千家万户。长期以来,多媒体信息在计算机中都是以文件形式存放,由操作系统管理的,但是随着计算机网络,分布式计算的发展,这种单纯的文件式管理已经力不从心了,对多媒体信息进行高效的管理,存取,查询已经成了一种迫切需求。而关系数据库却有着强大的数据管理能力。两方面密切结合,多媒体数据库由此应运而生。可以预见,随着多媒体处理需求的加强,多媒体数据库的应用将越来越广泛。 Oracle作为一家著名的数据库厂商,在多媒体信息处理上,更是走在了前边。本文将就Oracle对多媒体信息进行处理的方式,工具,特色以及一些基本原理做一个综述。希望对读者有所启发。当然,关系数据库还有好多家,虽然开发工具,编程接口语句各异,但在数据类型、处理方式上比较相似。所以我们在此略过。 二.多媒体数据类型介绍 在关系型数据库中,多媒体信息等大型对象是由lob型字段来进行存取的。在Oracle8i中,正式引入了此标准,以适应多媒体大对象处理的需求。Oracle数据库中,lob型数据有以下几种: -------------------------------------------- Lob类型 说明 Clob: 和Oracle7的long型相似,clob可以存储单字节型数据 Nclob: Nclob存储定宽的多字节国家字符集数据 Blob: 和Oracle7中的long raw类型相似。可以存储无结构的二进制数据。Oracle8没有对这种数据进行解释 ,只是按照原来的形式存储和检索它。 Bfile: Bfile允许对Oracle数据库以外存储的大型二进制文件进行只读形式的访问。和其它三种lob类型数据 不同的是,bfile类型数据存储在一个单独的文件中,该文件不由Oracle来维护。 特点: 1.在Oracle7中,相应的long或long raw字段有2g的限制,而lob的限制是4g 。 2.lob可以使用调用接口OCI或者由pl/sql利用dbms_lob包进行操纵。 3.lob不象long型那样每个表中最多只有一个字段的限制,其可以有多个,而又可以利用触发器的特性。 4.lob数据处理可以获得与其它数据同样的事物特性。 5.lob的存储比较特殊,它并不是跟其他数据存储在同一个数据库表中,而是可以单独存放于不同的表空间中,由一个定位符指向实际的lob数据。 三.多媒体大对象存取例程举例 按照如下步骤来完成各个操作: (1)先建立一个数据库表: create table lobdemo(key NUMBER KEY,clob_col CLOB,blob_col BLOB,bifle_col BFILE); 这个数据库第一列存储一个码,另外三列存储lob型数据。 (2)表建好以后,往表中插入一条数据: insert into lobdemo(key,clob_col,blob_col,bfile_col) values (10,'abcdefghijklmnopqrsatuvwxyzasdffasfsdafsdafsdfadfsadfsdfsdfdsdsffds',empty_blob(),null); 在这一条数据中,第二列我们插入一个字符串,它被格式化为clob类型数据进行存储;第二列我们使用empty_blob()函数来初始化一个定位符,以后就可以获取这个定位符进行比如select,update等操作了;第三列赋空值,它并没有获得一个定位符,这是与empty_blob()函数的区别。 (3)查询插入表中的数据 select blob_col from boldemo where key=20; 注意:这一sql语句的返回结果是一个定位符(locator),而不是实际的数据本身。 (4)修改数据库中数据 update lobdemo SET blob_col='aedevbagddgagdfdfasasdfdsa' where key=10; 从这些sql语句当中,我们看到了lob型数据处理的基本方法,发现与其他类型数据处理相似。但是sql语句中lob型数据处理的特殊性在于以下方面: (1)bfile文件的处理: bfile类型有着特殊性,跟clob,blob不同。实际的数据文件存储在操作系统的外面:所以有两个特点:1.没有事务性控制 2.bfile是只读的,不能用dbms_lob或oracl8 oci进行修改。让我们来看对bfile的操作步骤: <1> 为了访问外部文件,服务器需要知道文件在操作系统中的位置。下面我们建立一个目录:create DIRECTORY utils AS '/home/utils';utils表示目录逻辑名,'/home/utils'是实际目录。 <2>使用bfilename函数插入一行数据: insert into lobdemo(key,bfile_col) values (-1,biflename('utils','file1')); bfilename函数的第一个参数是逻辑目录名,第二个参数是文件名。注意:这一行中插入的是一个指向/home/utils/file1的lob定位符,并不是文件本身。 (2)利用dbms_lob包进行lob数据操作 sql仅可以操纵整个lob,而不能操纵数据片。dbms_lob包则放开了这个限制,它提供对lob数据中数据片的操作。这个包中包含十几个例程,读者可以查阅Oracle pl/sql手册,本文只介绍三个函数:fileopen()用来打开一个操作系统文件;loadfromfile()例程用来往目标lob字段填充一个操作系统文件,这个函数很有实用价值,因为有许多lob内容在sql语句中是不可描述的,例如一个二进制音频文件,而用这个函数可以将文件内容导入到数据库;getlength函数计算文件的长度。请看下面一个存储过程中这三个函数的使用: create or replace procedure FileExec( p_Directory in VARCHAR2, p_Filename IN VARCHAR2 ) AS v_FileLocator BFILE; v_CLOBLocator CLOB; BEGIN --为update初始化一个定位符 SELECT clob_col INTO v_CLOBLocator FROM lobdemo WHERE key=-1 FOR UPDATE; --为读文件初始化一个BFILE定位符 v_FileLocator:=BFILEOPEN(p_Derectory,p_Filename); --用dbms_lob包的fileopen打开一个操作系统文件 DBMS_LOB.FILEOPEN(v_FileLocator,DBMS_LOB.FILE_READONLY); --将整个操作系统文件装入lob中 DBMS_LOB.LOADFROMFILE(v_CLOBLocator,v_FileLocator,DBMS_LOB.GETLENGTH(v_FileLocator)); END FileExec; 四.Oracle InterMedia工具介绍 interMedia是Oracle推出的对Oracle8i多媒体功能进行扩充的一个集成部件,它使得Oracle能够更方便的管理图象、音频、视频、文本等信息。使得Oracle在internet,电子商务等领域多媒体数据的管理上可靠性与可用性增强。它包括image, audio, video三部份。interMedia使用对象类型,类似于JAVA或C++,来描述image, audio, video类型数据,Oracle在这三类对象类型中定义了许多方法来操作这些数据,如对于 image类型数据来说,你可以很方便地进行图形格式转换,压缩,拷贝,截取图形的任何一部份等,而这些是普通LOB类型数据所无法比拟的,普通sql语句也无法完成这些操作。 Internet的发展更突出了interMedia在WEB应用中的价值,现有的WEB应用绝大多数将image,audio,video等多媒体信息存在文件系统中,其优点是操作简单,速度快,缺点是管理复杂,尤其是管理大量image时就受到目录数等的限制。如果将image保存在数据库中,由数据库来统一维护,统一备份,这样就可以简化管理。 Intermedia中定义了几个多媒体对象类型,例如ORDAUDIO就是其中一个,它提供一些audio对象类型数据的操纵函数。下面我们来看一个例子,在这个例子中我们定义一个歌曲对象,建立一个歌曲对象的表,并对该表进行插入与查询操作。 (1)定义一个歌曲对象: CREATE TYPE songObject as OBJECT ( songId VARCHAR2(20), --歌曲号 title VARCHAR2(4000), --题目 artist VARCHAR2(4000), --作家 awards VARCHAR2(4000), --奖项 timePeriod VARCHAR2(20), --日期时间 txtinroduction CLOB, --简介 audioSource ORDSYS.ORDAUDIO --音频数据,这个字段由ORDAUDIO对象来定义。 ); (2)建立一个名为songtable的表: CREATE TABLE SongsTable of songObject (UNIQUE (songId), songId NOT NULL); (3)插入一行数据到SongsTable表中 INSERT INTO SongsTable VALUES ('00', 'Under Pressure', 'Queen', 'no awards', '80-90', 243, NULL, EMPTY_CLOB(), ORDSYS.ORDAudio(NULL, ORDSYS.ORDSource(EMPTY_BLOB(),NULL,NULL,NULL,NULL,NULL), NULL, NULL, EMPTY_CLOB(), NULL, NULL, NULL, NULL, NULL, NULL)); 注意:。EMPTY_CLOB,EMPTY_BLOB()函数只是初始化一个lob数据定位符,而没有存储实际的数据。 (4)向SongsTable表中载入一行数据: DECLARE audioObj ORDSYS.ORDAUDIO; ctx RAW(4000) := NULL; BEGIN --取得audioSource字段定位符 SELECT S.audioSource INTO audioObj FROM SongsTable S WHERE S.songId = '00' FOR UPDATE; --下面的四个函数是ORDAUDIO对象的成员函数,具体功能请查看Oracle开发手册 audioObj.setSource('FILE', 'AUDDIR', 'UnderPressure.au');--设定文件 audioObj.setMimeType('audio/basic'); --设定类型 audioObj.import
(2001-05-25· 张在建· yesky)
引文: 长期以来,多媒体信息在计算机中都是以文件形式存放,由操作系统管理的,但是随着计算机网络,分布式计算的发展,对多媒体信息进行高效的管理,存取,查询已经成了一种迫切需求。而关系数据库却有着强大的数据管理能力。两方面结合,多媒体数据库由此应运而生。本文将就Oracle对多媒体信息进行处理的方式,工具,特色以及一些基本原理做一个综述。 但是我们不能不遗憾的看到,现有数据库对一些多媒体数据所特有的操作能力还是很有限的。针对多媒体数据库的性能调优现在也遇到了新的问题。虽然如此,多媒体数据库仍旧产生了广阔的应用价值和前景。当然本文不可能面面俱到,有关Oracle多媒体信息处理的具体内容,请查阅Oracle相关手册。 一.应用前景综述 随着计算机处理能力的大副提高,多媒体早已经融入到了计算机当中了,如果缺少了多媒体,缺少了各种多姿多采的图象,音频,视频,很难想象计算机如今会走入千家万户。长期以来,多媒体信息在计算机中都是以文件形式存放,由操作系统管理的,但是随着计算机网络,分布式计算的发展,这种单纯的文件式管理已经力不从心了,对多媒体信息进行高效的管理,存取,查询已经成了一种迫切需求。而关系数据库却有着强大的数据管理能力。两方面密切结合,多媒体数据库由此应运而生。可以预见,随着多媒体处理需求的加强,多媒体数据库的应用将越来越广泛。 Oracle作为一家著名的数据库厂商,在多媒体信息处理上,更是走在了前边。本文将就Oracle对多媒体信息进行处理的方式,工具,特色以及一些基本原理做一个综述。希望对读者有所启发。当然,关系数据库还有好多家,虽然开发工具,编程接口语句各异,但在数据类型、处理方式上比较相似。所以我们在此略过。 二.多媒体数据类型介绍 在关系型数据库中,多媒体信息等大型对象是由lob型字段来进行存取的。在Oracle8i中,正式引入了此标准,以适应多媒体大对象处理的需求。Oracle数据库中,lob型数据有以下几种: -------------------------------------------- Lob类型 说明 Clob: 和Oracle7的long型相似,clob可以存储单字节型数据 Nclob: Nclob存储定宽的多字节国家字符集数据 Blob: 和Oracle7中的long raw类型相似。可以存储无结构的二进制数据。Oracle8没有对这种数据进行解释 ,只是按照原来的形式存储和检索它。 Bfile: Bfile允许对Oracle数据库以外存储的大型二进制文件进行只读形式的访问。和其它三种lob类型数据 不同的是,bfile类型数据存储在一个单独的文件中,该文件不由Oracle来维护。 特点: 1.在Oracle7中,相应的long或long raw字段有2g的限制,而lob的限制是4g 。 2.lob可以使用调用接口OCI或者由pl/sql利用dbms_lob包进行操纵。 3.lob不象long型那样每个表中最多只有一个字段的限制,其可以有多个,而又可以利用触发器的特性。 4.lob数据处理可以获得与其它数据同样的事物特性。 5.lob的存储比较特殊,它并不是跟其他数据存储在同一个数据库表中,而是可以单独存放于不同的表空间中,由一个定位符指向实际的lob数据。 三.多媒体大对象存取例程举例 按照如下步骤来完成各个操作: (1)先建立一个数据库表: create table lobdemo(key NUMBER KEY,clob_col CLOB,blob_col BLOB,bifle_col BFILE); 这个数据库第一列存储一个码,另外三列存储lob型数据。 (2)表建好以后,往表中插入一条数据: insert into lobdemo(key,clob_col,blob_col,bfile_col) values (10,'abcdefghijklmnopqrsatuvwxyzasdffasfsdafsdafsdfadfsadfsdfsdfdsdsffds',empty_blob(),null); 在这一条数据中,第二列我们插入一个字符串,它被格式化为clob类型数据进行存储;第二列我们使用empty_blob()函数来初始化一个定位符,以后就可以获取这个定位符进行比如select,update等操作了;第三列赋空值,它并没有获得一个定位符,这是与empty_blob()函数的区别。 (3)查询插入表中的数据 select blob_col from boldemo where key=20; 注意:这一sql语句的返回结果是一个定位符(locator),而不是实际的数据本身。 (4)修改数据库中数据 update lobdemo SET blob_col='aedevbagddgagdfdfasasdfdsa' where key=10; 从这些sql语句当中,我们看到了lob型数据处理的基本方法,发现与其他类型数据处理相似。但是sql语句中lob型数据处理的特殊性在于以下方面: (1)bfile文件的处理: bfile类型有着特殊性,跟clob,blob不同。实际的数据文件存储在操作系统的外面:所以有两个特点:1.没有事务性控制 2.bfile是只读的,不能用dbms_lob或oracl8 oci进行修改。让我们来看对bfile的操作步骤: <1> 为了访问外部文件,服务器需要知道文件在操作系统中的位置。下面我们建立一个目录:create DIRECTORY utils AS '/home/utils';utils表示目录逻辑名,'/home/utils'是实际目录。 <2>使用bfilename函数插入一行数据: insert into lobdemo(key,bfile_col) values (-1,biflename('utils','file1')); bfilename函数的第一个参数是逻辑目录名,第二个参数是文件名。注意:这一行中插入的是一个指向/home/utils/file1的lob定位符,并不是文件本身。 (2)利用dbms_lob包进行lob数据操作 sql仅可以操纵整个lob,而不能操纵数据片。dbms_lob包则放开了这个限制,它提供对lob数据中数据片的操作。这个包中包含十几个例程,读者可以查阅Oracle pl/sql手册,本文只介绍三个函数:fileopen()用来打开一个操作系统文件;loadfromfile()例程用来往目标lob字段填充一个操作系统文件,这个函数很有实用价值,因为有许多lob内容在sql语句中是不可描述的,例如一个二进制音频文件,而用这个函数可以将文件内容导入到数据库;getlength函数计算文件的长度。请看下面一个存储过程中这三个函数的使用: create or replace procedure FileExec( p_Directory in VARCHAR2, p_Filename IN VARCHAR2 ) AS v_FileLocator BFILE; v_CLOBLocator CLOB; BEGIN --为update初始化一个定位符 SELECT clob_col INTO v_CLOBLocator FROM lobdemo WHERE key=-1 FOR UPDATE; --为读文件初始化一个BFILE定位符 v_FileLocator:=BFILEOPEN(p_Derectory,p_Filename); --用dbms_lob包的fileopen打开一个操作系统文件 DBMS_LOB.FILEOPEN(v_FileLocator,DBMS_LOB.FILE_READONLY); --将整个操作系统文件装入lob中 DBMS_LOB.LOADFROMFILE(v_CLOBLocator,v_FileLocator,DBMS_LOB.GETLENGTH(v_FileLocator)); END FileExec; 四.Oracle InterMedia工具介绍 interMedia是Oracle推出的对Oracle8i多媒体功能进行扩充的一个集成部件,它使得Oracle能够更方便的管理图象、音频、视频、文本等信息。使得Oracle在internet,电子商务等领域多媒体数据的管理上可靠性与可用性增强。它包括image, audio, video三部份。interMedia使用对象类型,类似于JAVA或C++,来描述image, audio, video类型数据,Oracle在这三类对象类型中定义了许多方法来操作这些数据,如对于 image类型数据来说,你可以很方便地进行图形格式转换,压缩,拷贝,截取图形的任何一部份等,而这些是普通LOB类型数据所无法比拟的,普通sql语句也无法完成这些操作。 Internet的发展更突出了interMedia在WEB应用中的价值,现有的WEB应用绝大多数将image,audio,video等多媒体信息存在文件系统中,其优点是操作简单,速度快,缺点是管理复杂,尤其是管理大量image时就受到目录数等的限制。如果将image保存在数据库中,由数据库来统一维护,统一备份,这样就可以简化管理。 Intermedia中定义了几个多媒体对象类型,例如ORDAUDIO就是其中一个,它提供一些audio对象类型数据的操纵函数。下面我们来看一个例子,在这个例子中我们定义一个歌曲对象,建立一个歌曲对象的表,并对该表进行插入与查询操作。 (1)定义一个歌曲对象: CREATE TYPE songObject as OBJECT ( songId VARCHAR2(20), --歌曲号 title VARCHAR2(4000), --题目 artist VARCHAR2(4000), --作家 awards VARCHAR2(4000), --奖项 timePeriod VARCHAR2(20), --日期时间 txtinroduction CLOB, --简介 audioSource ORDSYS.ORDAUDIO --音频数据,这个字段由ORDAUDIO对象来定义。 ); (2)建立一个名为songtable的表: CREATE TABLE SongsTable of songObject (UNIQUE (songId), songId NOT NULL); (3)插入一行数据到SongsTable表中 INSERT INTO SongsTable VALUES ('00', 'Under Pressure', 'Queen', 'no awards', '80-90', 243, NULL, EMPTY_CLOB(), ORDSYS.ORDAudio(NULL, ORDSYS.ORDSource(EMPTY_BLOB(),NULL,NULL,NULL,NULL,NULL), NULL, NULL, EMPTY_CLOB(), NULL, NULL, NULL, NULL, NULL, NULL)); 注意:。EMPTY_CLOB,EMPTY_BLOB()函数只是初始化一个lob数据定位符,而没有存储实际的数据。 (4)向SongsTable表中载入一行数据: DECLARE audioObj ORDSYS.ORDAUDIO; ctx RAW(4000) := NULL; BEGIN --取得audioSource字段定位符 SELECT S.audioSource INTO audioObj FROM SongsTable S WHERE S.songId = '00' FOR UPDATE; --下面的四个函数是ORDAUDIO对象的成员函数,具体功能请查看Oracle开发手册 audioObj.setSource('FILE', 'AUDDIR', 'UnderPressure.au');--设定文件 audioObj.setMimeType('audio/basic'); --设定类型 audioObj.import
解决方案 »
- 想把oracle学的更好一点,高手们推荐两本书吧!
- oracle 中rman如何启动?
- 还是ORA-04030错误,高手请指教,如何解决
- sql 查找某列连续的几个值是否相同
- 怎么在存储过程里面调用链路的存储过程
- 在数据库中怎样用汉字的首字母查询数据!!!!!!!!!
- oracle9i中无法向数据库中的date类型列输入数据?????,紧急求救
- 有难度的回滚段问题,请高手救命!!!!
- 看起来很简单,其实应该简单,但看不出问题出在哪里
- 数据库接口规范
- 启动OracleOraHome81ManagementServer服务错误
- 8。1。6是否取消了oem-dba management pack???
table_name in varchar2,
field_id in varchar2,
field_name in varchar2,
v_id in number,
v_pos in number,
v_clob in varchar2)
is
lobloc clob;
c_clob varchar2(32767);
amt binary_integer;
pos binary_integer;
query_str varchar2(1000);
begin
pos:=v_pos*32766+1;
amt := length(v_clob);
c_clob:=v_clob;
query_str :='select '||field_name||' from '||table_name||' where '||field_id||'= :id for update ';
--initialize buffer with data to be inserted or updated
EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
--from pos position, write 32766 varchar2 into lobloc
dbms_lob.write(lobloc, amt, pos, c_clob);
commit;
exception
when others then
rollback;
end;
/
用法说明:
在插入或修改以前,先把其它字段插入或修改,CLOB字段设置为空empty_clob(),
然后调用以上的过程插入大于2048到32766个字符。
如果需要插入大于32767个字符,编一个循环即可解决问题。查询CLOB的PL/SQL函数:getclob
create or replace function getclob(
table_name in varchar2,
field_id in varchar2,
field_name in varchar2,
v_id in number,
v_pos in number) return varchar2
is
lobloc clob;
buffer varchar2(32767);
amount number := 2000;
offset number := 1;
query_str varchar2(1000);
begin
query_str :='select '||field_name||' from '||table_name||' where '||field_id||'= :id ';
--initialize buffer with data to be found
EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
offset:=offset+(v_pos-1)*2000;
--read 2000 varchar2 from the buffer
dbms_lob.read(lobloc,amount,offset,buffer);
return buffer;
exception
when no_data_found then
return buffer;
end;
/用法说明:用select getclob(table_name,field_id,field_name,v_id,v_pos) as partstr from dual;
可以从CLOB字段中取2000个字符到partstr中,
编一个循环可以把partstr组合成dbms_lob.getlength(field_name)长度的目标字符串。