eygle.com   eygle.com
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



历史上的今天...
      >> 2006-04-30文章:
             祝大家五一快乐
------
这篇 【使用PL/SQL从数据库中读取BLOB对象】来自 eygle.com | CSDN网摘| del.icio.us|Google订阅 | 鲜果订阅 | 抓虾订阅

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

相关文章 随机文章
SQL 共享之 ROLL_INVALID_MISMATCH 含义
CBO中 SMON 进程与 col_usage$ 的维护
10g临时表空间组导致递归SQL高度解析案例
Oracle的SQL可以有多长?
如何对时间进行简单加减运算
2009 CSDN英雄会记事 - 时间规划非常重要
Statspack之一-Statspack简介
回家纪事-之一
弃我去者今日之日不可留
DataGuard数据库服务器硬盘故障处理一则
搜索本站:

留言 (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~2010 eygle.com, All rights reserved.