AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > Oracle

Oracle数据库处理多媒体信息

51自学网 http://www.51zixue.net

  三.多媒体大对象存取例程举例

  按照如下步骤来完成各个操作:

  (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(ctx); --载入ctx

    audioObj.setProperties(ctx); --设置属性

    --将歌曲对象载入到数据库表中

    UPDATE SongsTable S
     SET S.audioSource = audioObj
     WHERE S.songId = '00';

     COMMIT;

    END;

 
 

上一篇:Oracle组件实现动态Web数据库  下一篇:Oracle回滚段的概念,用法和规划及问题的解决