Oracle 下如何存储成文件

dy_outline 2010-12-25 04:20:34
数据库中有一个存储过程(不是我写的),主要功能是把传输进来的照片存储成BLOB。但在Oracle9i下,导致数据库的存储空间不断上涨,我想把原来存储成Blob的数据,直接存储成文件的格式,比如D盘的某个目录下,不知道该怎么修改。
原来的语句如下:
insert into PhotoList (xh,zp) values (picxh,empty_blob);
update zp=zp1 where xh=picxh;

也就是把原来存成Blob的字段,存储成硬盘上的图片文件。

在网上找了一天,据说Utl_file可以实现这个功能,但我测试了一下,老是有问题。
数据库是Oracle 9i
谢谢。

不知道我把问题说明白了吗。
...全文
158 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Oraclefans_ 2010-12-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oraclefans_ 的回复:]
引用 6 楼 dy_outline 的回复:
引用 4 楼 tangren 的回复:
图片存储在表中,表空间大小不断上涨是正常的,难道放在磁盘上就不占用空间?
从管理和检索角度上说,存储在数据库是很好的。
表空间维护也很方便。


我的这个图片确实比较多,每天大约0.5万张左右,虽然经过核对后的图片就被删除了,但Oracle的表空间却不能释放。年初的时候重建过一次表空间,现在存放图片……
[/Quote]
我平时使用java做开发的时候,一般都是这样处理的。。。不使用数据库来取图片,而是通过数据库存储的路径来取图片。。。
Oraclefans_ 2010-12-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dy_outline 的回复:]
引用 4 楼 tangren 的回复:
图片存储在表中,表空间大小不断上涨是正常的,难道放在磁盘上就不占用空间?
从管理和检索角度上说,存储在数据库是很好的。
表空间维护也很方便。


我的这个图片确实比较多,每天大约0.5万张左右,虽然经过核对后的图片就被删除了,但Oracle的表空间却不能释放。年初的时候重建过一次表空间,现在存放图片的表空间又达到了500多G,整个数据库也慢的要命……
[/Quote]

你在你的磁盘里建立一个路径,专门用来存储你的图片,然后你在设置一个字段设置为你的文件路径。

当你的程序在使用图片的时候,先判断文件是否存在,如果存在再取不就可以了吗?
dy_outline 2010-12-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tangren 的回复:]
图片存储在表中,表空间大小不断上涨是正常的,难道放在磁盘上就不占用空间?
从管理和检索角度上说,存储在数据库是很好的。
表空间维护也很方便。
[/Quote]

我的这个图片确实比较多,每天大约0.5万张左右,虽然经过核对后的图片就被删除了,但Oracle的表空间却不能释放。年初的时候重建过一次表空间,现在存放图片的表空间又达到了500多G,整个数据库也慢的要命。存图片的想法,也就是在没有其他的解决办法的情况下,。。。。
dy_outline 2010-12-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tangren 的回复:]
下面的10g是可以的,9i据说utl_file.put_raw有bug

SQL code
SQL> DESC IMAGE_LOB
Name Type Nullable Default Comments
------- ----------- -------- ------- --------
T_ID VARCHAR2(5) ……
[/Quote]

谢谢,我实验一下。
tangren 2010-12-25
  • 打赏
  • 举报
回复
图片存储在表中,表空间大小不断上涨是正常的,难道放在磁盘上就不占用空间?
从管理和检索角度上说,存储在数据库是很好的。
表空间维护也很方便。
tangren 2010-12-25
  • 打赏
  • 举报
回复
下面的10g是可以的,9i据说utl_file.put_raw有bug
SQL> DESC IMAGE_LOB
Name Type Nullable Default Comments
------- ----------- -------- ------- --------
T_ID VARCHAR2(5)
T_IMAGE BLOB

CREATE OR REPLACE PROCEDURE IMG_SAVE(TID VARCHAR2, FILENAME VARCHAR2) IS
l_file utl_file.file_type;
l_lob BLOB;
l_offset INT := 1;
l_amount INT := 1000;
l_len INT := 0;
l_buffer RAW(1000);
BEGIN
SELECT T_IMAGE INTO l_lob FROM IMAGE_LOB WHERE T_ID = TID;
--d:\temp是在utl_file_dir参数中设置的目录
l_file := utl_file.fopen('d:\temp', FILENAME, 'wb', 1000);
l_len := dbms_lob.getlength(l_lob);

WHILE l_offset <= l_len LOOP
dbms_lob.read(l_lob, l_amount, l_offset, l_buffer);
utl_file.put_raw(l_file, l_buffer, TRUE);

l_offset := l_offset + l_amount;
END LOOP;
utl_file.fclose(l_file);
END IMG_SAVE;
/
--自己先存入一张图片
--测试一下
EXEC IMG_SAVE('1','test2.gif');
dy_outline 2010-12-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhuomingwang 的回复:]
存图片的话 存路径不是更好吗?
[/Quote]
嘿,还是没说明白,我就是想把原来存储blob的方式改成存路径的方式。
这个问题表述起来有点困难。
  • 打赏
  • 举报
回复
存图片的话 存路径不是更好吗?

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧