技术开发 频道

Oracle数据库处理多媒体信息

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

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

    (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;

0
相关文章