oracle8i用ado读取blob,使用PL/SQL从数据库中读取BLOB对象

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

6ee5639a40442445944d63b514b2dd02.png

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

谢谢回复!

EYGLE大师,

我用你的方法导出图片,

图片是导出来了,

但不能打开.

我看了文件的大小,比实际要小222,

这是为什么?

请大师解答.

谢谢,那么9i您有相关的方法吗?

我找了一个星期了!

麻烦您给个方法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值