数据库中有一个存储过程(不是我写的),主要功能是把传输进来的照片存储成BLOB。但在Oracle9i下,导致数据库的存储空间不断上涨,我想把原来存储成Blob的数据,直接存储成文件的格式,比如D盘的某个目录下,不知道该怎么修改。
原来的语句如下:
insert into PhotoList (xh,zp) values (picxh,empty_blob);
update zp=zp1 where xh=picxh;也就是把原来存成Blob的字段,存储成硬盘上的图片文件。在网上找了一天,据说Utl_file可以实现这个功能,但我测试了一下,老是有问题。
数据库是Oracle 9i
谢谢。不知道我把问题说明白了吗。

解决方案 »

  1.   

    嘿,还是没说明白,我就是想把原来存储blob的方式改成存路径的方式。
    这个问题表述起来有点困难。
      

  2.   

    下面的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');
      

  3.   


    我的这个图片确实比较多,每天大约0.5万张左右,虽然经过核对后的图片就被删除了,但Oracle的表空间却不能释放。年初的时候重建过一次表空间,现在存放图片的表空间又达到了500多G,整个数据库也慢的要命。存图片的想法,也就是在没有其他的解决办法的情况下,。
      

  4.   

    我平时使用java做开发的时候,一般都是这样处理的不使用数据库来取图片,而是通过数据库存储的路径来取图片