数据库中有一个存储过程(不是我写的),主要功能是把传输进来的照片存储成BLOB。但在Oracle9i下,导致数据库的存储空间不断上涨,我想把原来存储成Blob的数据,直接存储成文件的格式,比如D盘的某个目录下,不知道该怎么修改。
原来的语句如下:
insert into PhotoList (xh,zp) values (picxh,empty_blob);
update zp=zp1 where xh=picxh;也就是把原来存成Blob的字段,存储成硬盘上的图片文件。在网上找了一天,据说Utl_file可以实现这个功能,但我测试了一下,老是有问题。
数据库是Oracle 9i
谢谢。不知道我把问题说明白了吗。
原来的语句如下:
insert into PhotoList (xh,zp) values (picxh,empty_blob);
update zp=zp1 where xh=picxh;也就是把原来存成Blob的字段,存储成硬盘上的图片文件。在网上找了一天,据说Utl_file可以实现这个功能,但我测试了一下,老是有问题。
数据库是Oracle 9i
谢谢。不知道我把问题说明白了吗。
这个问题表述起来有点困难。
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');
我的这个图片确实比较多,每天大约0.5万张左右,虽然经过核对后的图片就被删除了,但Oracle的表空间却不能释放。年初的时候重建过一次表空间,现在存放图片的表空间又达到了500多G,整个数据库也慢的要命。存图片的想法,也就是在没有其他的解决办法的情况下,。