eygle.com   eygle.com
eygle.com  
 

« 使用存储过程(PL/SQL)向数据库中存储BLOB对象 | Blog首页 | 五一的生活 »

使用PL/SQL从数据库中读取BLOB对象

作者:eygle |【转载时请务必以超链接形式标明文章和作者信息及本声明
链接:
1.确认现有对象
SQL> col fdesc for a30
SQL> select fid,fname,fdesc from eygle_blob;

       FID FNAME                                              FDESC
---------- -------------------------------------------------- ------------------------------
         1 ShaoLin.jpg                                        少林寺-康熙手书
         2 DaoYing.jpg                                        倒映

2.创建存储Directory
SQL> connect / as sysdba
Connected.
SQL> create or replace directory BLOBDIR as 'D:\oradata\Pic';

Directory created.

SQL>
SQL> grant read,write on directory BLOBDIR to eygle;

Grant succeeded.

SQL>

3.创建存储过程
SQL> connect eygle/eygle
Connected.
SQL>
SQL> CREATE OR REPLACE PROCEDURE eygle_dump_blob (piname varchar2,poname varchar2) IS
  2    l_file      UTL_FILE.FILE_TYPE;
  3    l_buffer    RAW(32767);
  4    l_amount    BINARY_INTEGER := 32767;
  5    l_pos       INTEGER := 1;
  6    l_blob      BLOB;
  7    l_blob_len  INTEGER;
  8  BEGIN
  9    SELECT FPIC
 10    INTO      l_blob
 11    FROM      eygle_blob
 12    WHERE  FNAME = piname;
 13
 14    l_blob_len := DBMS_LOB.GETLENGTH(l_blob);
 15    l_file := UTL_FILE.FOPEN('BLOBDIR',poname,'wb', 32767);
 16
 17    WHILE l_pos < l_blob_len LOOP
 18      DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer);
 19      UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE);
 20      l_pos := l_pos + l_amount;
 21    END LOOP;
 22
 23    UTL_FILE.FCLOSE(l_file);
 24
 25  EXCEPTION
 26    WHEN OTHERS THEN
 27      IF UTL_FILE.IS_OPEN(l_file) THEN
 28        UTL_FILE.FCLOSE(l_file);
 29      END IF;
 30      RAISE;
 31  END;
 32  /

Procedure created.

4.取出数据
SQL> host ls -l d:\oradata\Pic
total 7618
-rwxrwxrwa   1 gqgai           None            2131553 Apr 19 10:12 DaoYing.jpg
-rwxrwxrwa   1 gqgai           None            1768198 Apr 19 10:12 ShaoLin.jpg

SQL> exec eygle_dump_blob('ShaoLin.jpg','01.jpg')

PL/SQL procedure successfully completed.

SQL> host ls -l d:\oradata\Pic
total 11072
-rwxrwxrwa   1 Administrators  SYSTEM          1768198 Apr 26 07:16 01.jpg
-rwxrwxrwa   1 gqgai           None            2131553 Apr 19 10:12 DaoYing.jpg
-rwxrwxrwa   1 gqgai           None            1768198 Apr 19 10:12 ShaoLin.jpg

SQL>
SQL> exec eygle_dump_blob('DaoYing.jpg','02.jpg')

PL/SQL procedure successfully completed.

SQL> host ls -l d:\oradata\Pic
total 15236
-rwxrwxrwa   1 Administrators  SYSTEM          1768198 Apr 26 07:16 01.jpg
-rwxrwxrwa   1 Administrators  SYSTEM          2131553 Apr 26 07:19 02.jpg
-rwxrwxrwa   1 gqgai           None            2131553 Apr 19 10:12 DaoYing.jpg
-rwxrwxrwa   1 gqgai           None            1768198 Apr 19 10:12 ShaoLin.jpg


-----
这篇 【使用PL/SQL从数据库中读取BLOB对象】来自 www.eygle.com | CSDN技术网摘| del.icio.us|365Key

By eygle on 2005-04-30 21:06 | Comments (14) | Posted to SQL.PLSQL | Edit |Pageviews:

相关文章 随机文章
  • 如何对时间进行简单加减运算
  • 并行查询并行度Degree与instances 设置
  • 关于PARALLEL_MAX_SERVERS参数的设置
  • 使用REF CURSOR处理Oracle的结果集
  • Oracle Peeking绑定变量的控制
  • 使用RMAN的备份及恢复一例-丢失所有控制文件
    Linux单磁盘IO速度概要
    到达以及离开 下一站昆明
    城市女孩-王雅婕作品
    Oracle中如何快速的卸载和加载数据?
    网上相关主题:
    Google

    留言 (14)

    非常好,见过最详细的一个关于存储blob对象的资料,谢谢

    Posted by: ppiao at July 12, 2005 10:46 AM

    刚接触oracle,需要建一个大型的图像数据库
    用dbms_lob package 总是出错

    以前没有将directory的read权限赋给用户时,报错:
    对不存在的目录或文件进行fileopen操作

    我按照这个方法做了一下,还是报错:
    文件或lob操作fileopen失败 系统找不到指定文件

    难道是我的oracle安装有问题,

    Posted by: 初学者 at August 3, 2005 1:08 PM

    是你的用法有问题吧,你的数据库什么版本?

    Posted by: eygle at August 3, 2005 1:16 PM

    oracle版本为9.0. 操作系统为winxp sp2
    好像又好了,我也不明白怎么回事,以前不能用的都可以执行了,也许是配置有问题吧。

    但是这里好像还有个问题要请教一下,是否对象文件必须要安装服务器的机器上,如果是在客户机上的文件如何存到数据库中呢,用ado?

    Posted by: 初学者 at August 4, 2005 12:38 PM

    你是要加载还是卸载啊?

    如果是加载Lob对象,是这篇文章:
    http://www.eygle.com/archives/2005/04/eoaiplsqlieoeao.html

    Posted by: eygle at August 4, 2005 2:09 PM

    大侠,Put_raw方法数据库(9.01)不支持,好像只有ORACLE 9.2才支持,咋办?

    Posted by: simon fang at October 20, 2005 5:16 PM

    901这个版本还真没用过,这是9i最不稳定的一个版本。

    如果不能升级,我倒是想可以试试看把9iR2的这个Package迁移到901里。

    Posted by: eygle at October 20, 2005 7:55 PM

    l_file := UTL_FILE.FOPEN('BLOBDIR',poname,'wb', 32767);
    为什么open_mode 是'wb',我的oracle 版本是9.2.0.1.0 。我的UTL_FILE.FOPEN包的open_mode参数只支持'r', 'w', 'a'.


    谢谢回复!

    Posted by: xiaolong at December 21, 2005 2:34 PM

    这是10g的效果,9i这种方式有Bug。

    Posted by: eygle at December 21, 2005 2:44 PM

    能贴个9i的方法出来吗?

    Posted by: xiaolong at December 21, 2005 3:04 PM

    EYGLE大师,
    我用你的方法导出图片,
    图片是导出来了,
    但不能打开.
    我看了文件的大小,比实际要小222,
    这是为什么?
    请大师解答.

    Posted by: steven1981 at January 18, 2006 3:56 PM

    10g才可以,9i不行的.

    Posted by: eygle at January 18, 2006 4:01 PM

    谢谢,那么9i您有相关的方法吗?
    我找了一个星期了!
    麻烦您给个方法!

    Posted by: steven1981 at January 18, 2006 4:09 PM

    请给出一个9.2.0.1版本的,谢谢

    Posted by: leon at September 21, 2006 4:30 PM

    发表留言:



    Remember Me?
    (输入验证码后方可评论,谢谢支持)



    CopyRight © 2004 eygle.com, All rights reserved.