SQL求助,求一个导出BLOB图片文件的过程

hhq201 2012-01-19 10:21:25
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 ;
...全文
279 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhq201 2012-02-06
  • 打赏
  • 举报
回复
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 /
争取今天 2012-01-24
  • 打赏
  • 举报
回复
文件有多大,好像put_raw写的是二进制格式,应该不存在转换问题.
utl_file.put_raw好像要刷新一下缓存,不如写道一定程度也会抱错.
hhq201 2012-01-21
  • 打赏
  • 举报
回复
blob转换为文件,怀疑在写入文件utl_file.put_raw()的时候,会把换行符“0A”转换为“0D 0A”,也就是DOS下的换行符问题,不知道有没有方法可以绕过这个转换。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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