put_raw 的时候超过了文件写入的限制,怎么解决?declare
lobloc blob;
buffer raw(2000);
amount int;
offset int:=1;
offset_size int:=2000;
handle utl_file.file_type;
begin
select photo into lobloc from lob_example2
where id=2;
amount:=dbms_lob.getlength(lobloc);
dbms_output.put_line(amount);
while (offset < amount) loop
dbms_lob.read(lobloc,offset_size,offset,buffer);
offset:=offset + offset_size;
handle:=utl_file.fopen('TT','a.jpg','w',offset_size);
utl_file.put_raw(handle,buffer);
dbms_output.put_line(offset);
utl_file.new_line(handle);
utl_file.fclose(handle);
end loop;
end ;

解决方案 »

  1.   

    blob转换为文件,怀疑在写入文件utl_file.put_raw()的时候,会把换行符“0A”转换为“0D 0A”,也就是DOS下的换行符问题,不知道有没有方法可以绕过这个转换。
      

  2.   

    文件有多大,好像put_raw写的是二进制格式,应该不存在转换问题.
    utl_file.put_raw好像要刷新一下缓存,不如写道一定程度也会抱错.
      

  3.   

    1. 使用UTL_FILE.GET_RAW 和UTL_FILE.PUT_RAW 函数,在ORACLE 9i上,Windows的系统下,存在换行符转换的BUG。
    2. 在ORACLE 10g上,在打开文件时,UTL_FILE.FOPEN函数可带参数b,采用binary的方式处理文件,修复了这个BUG。
    3. SQL:
      1       declare
      2      vblob blob;
      3      vstart number:=1;
      4      bytelen number := 32000;
      5      len number;
      6      my_vr raw(32000);
      7          l_output utl_file.file_type;
      8  begin
      9      l_output := utl_file.fopen('TT', 'a.jpg', 'wb', 32760);
     10      SELECT photo into vblob FROM lob_example2 where id = 2 and rownum =1;
     11          len :=  DBMS_LOB.GETLENGTH(vblob);
     12          dbms_output.put_line('Length of the Column :  ' || to_char(len));
     13          vstart := 1;
     14          while (vstart < len) loop  
     15          dbms_output.put_line('vstart : ' || to_char(vstart));
     16              DBMS_LOB.READ(vblob,bytelen,vstart,my_vr);
     17              utl_file.put_raw(l_output,my_vr);
     18              utl_file.fflush(l_output);
     19              vstart := vstart + bytelen ;
     20          end loop;
     21          utl_file.fclose(l_output);
     22  end ;
     23  /