向数据库中存储以及读取BLOB对象

对LOB类型的数据是很特殊的,读取以及存储都与一般的类型不同:

1、存储BLOB类型:

首先需要建一个directory ,用来存放图片的文件夹地址:

create or replace directory BLOBDIR as 'D:/oradata/Pic';

grant read,write on directory BLOBDIR to  daimin;

新建表

CREATE TABLE daimin_blob (
    fid    number,
    fname       varchar2(50),
    fdesc  varchar2(200),
    fpic        BLOB);

 create sequence S_daimin_SEQ
    start with 1
    increment by 1;

创建下面的存储过程:

  CREATE OR REPLACE PROCEDURE daimin_load_blob (pfname VARCHAR2,pdesc varchar2)
    IS
    src_file BFILE;
    dst_file BLOB;
    lgh_file BINARY_INTEGER;
    BEGIN
       src_file := bfilename('BLOBDIR', pfname);--读取原文件的内容
  
       INSERT INTO daimin_blob  (fid,fname,fdesc,fpic)
      VALUES (S_daimin_SEQ.Nextval,pfname,pdesc,EMPTY_BLOB()) --注意BLOB类型的字段在插入操作的时候的                                                                                                                      --必须先初始化为EMPTY_BLOB(),再做更新操作更新为自己想插入的内容
      RETURNING fpic INTO dst_file;
 
      SELECT fpic INTO dst_file
      FROM daimin_blob  WHERE fname = pfname FOR UPDATE;
 
      dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
      lgh_file := dbms_lob.getlength(src_file);
      dbms_lob.loadfromfile(dst_file, src_file, lgh_file);  --从文件中向数据库加载图片到BLOB类型的变量 
     UPDATE daimin_blob  SET fpic = dst_file
     WHERE fname = pfname;    --再作更新操作更新为加载后的内容
 
     dbms_lob.fileclose(src_file);
     commit;
   END daimin_load_blob;

BEGIN
daimin_load_blob('I_am.gif','ddddd');
enD;

执行上面的语句之后则原来的表中就查看到新加载的文件

select * from daimin_blob;

2、读取BLOB类型:

CREATE OR REPLACE PROCEDURE daimin_dump_blob (piname varchar2,poname varchar2) IS
     l_file      UTL_FILE.FILE_TYPE;
     l_buffer    RAW(32767);
      l_amount    BINARY_INTEGER := 32767;
      l_pos       INTEGER := 1;
      l_blob      BLOB;
      l_blob_len  INTEGER;
    BEGIN
      SELECT FPIC
     INTO      l_blob
     FROM      daimin_blob
     WHERE  FNAME = piname;  
 
     l_blob_len := DBMS_LOB.GETLENGTH(l_blob);
     l_file := UTL_FILE.FOPEN('BLOBDIR',poname,'wb', 32767); --以可写模式打开文件并将文件的handle返回 
     WHILE l_pos < l_blob_len LOOP
       DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer);--读取文件中的内容,并写到文件中
       UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE); --将上面读出到buffer的数据fresh了下
      l_pos := l_pos + l_amount;
     END LOOP;
 
     UTL_FILE.FCLOSE(l_file);
 
   EXCEPTION
     WHEN OTHERS THEN
       IF UTL_FILE.IS_OPEN(l_file) THEN
         UTL_FILE.FCLOSE(l_file);      
       END IF;
       RAISE;
   END;

  begin
   daimin_dump_blob('I_am.gif','03.jpg');
   end;

执行上面的语句,则在'D:/oradata/Pic'文件夹下发现有新的图片'03.jpg'存在,说明读取成功。

上面的学习步骤是按照http://www.eygle.com/archives/2005/04/eoaplsqloeaoeae.htmlhttp://www.eygle.com/archives/2005/04/eoaiplsqlieoeao.html练习了一遍,只是为了方便自己以后查找。这个不是原创。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值