« 使用存储过程(PL/SQL)向数据库中存储BLOB对象 | Blog首页 | 五一的生活 »
使用PL/SQL从数据库中读取BLOB对象
作者:eygle | 【转载请注出处】|【云和恩墨 领先的zData数据库一体机 | zCloud PaaS云管平台 | SQM SQL审核平台 | ZDBM 数据库备份一体机】
链接:https://www.eygle.com/archives/2005/04/eoaplsqloeaoeae.html
1.确认现有对象链接:https://www.eygle.com/archives/2005/04/eoaplsqloeaoeae.html
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.创建存储过程
4.取出数据
历史上的今天...
>> 2020-04-30文章:
>> 2012-04-30文章:
>> 2010-04-30文章:
>> 2006-04-30文章:
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
历史上的今天...
>> 2020-04-30文章:
>> 2012-04-30文章:
>> 2010-04-30文章:
>> 2006-04-30文章:
By eygle on 2005-04-30 21:06 | Comments (14) | SQL.PLSQL | 275 |
非常好,见过最详细的一个关于存储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版本的,谢谢