eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

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

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

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



历史上的今天...
    >> 2012-04-30文章:
           北京房山云居寺游记
    >> 2010-04-30文章:
    >> 2006-04-30文章:
           祝大家五一快乐

无觅

By eygle on 2005-04-30 21:06 | Comments (14) | SQL.PLSQL | 275 |

14 Comments

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

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

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

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

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

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

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

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

你是要加载还是卸载啊?

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

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

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

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

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'.


谢谢回复!

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

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

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

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

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

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


CopyRight © 2004~2020 云和恩墨,成就未来!, All rights reserved.
数据恢复·紧急救援·性能优化 云和恩墨 24x7 热线电话:400-600-8755 业务咨询:010-59007017-7040 or 7037 业务合作: marketing@enmotech.com