这个问题可能是解决了:将函数decode_base64里循环里的v_offset := v_offset + v_buffer_size修改为v_offset := v_offset + v_buffer_size-1,原因不知道,完全是蒙的,只是显示出来的照片,从人眼来看,是完整的,不像原来那样下面很明显的少一块。

函数replaceClob是不需要的。

完整的脚本是:

--从base64编码的照片转换为blob类型,

--

function decode_base64(p_clob_in in clob) return blob is

v_blob blob;

v_offset integer;

v_tem_clob clob;

v_buffer_varchar varchar2(32000);

v_buffer_raw raw(32000);

v_buffer_size binary_integer := 32000;

begin

if p_clob_in is null then

return null;

end if;

dbms_lob.CREATETEMPORARY(v_blob, true);

v_offset := 1;

FOR i IN 1..CEIL(dbms_lob.GETLENGTH(p_clob_in) / v_buffer_size) loop

dbms_lob.READ(p_clob_in, v_buffer_size, v_offset, v_buffer_varchar);

v_buffer_raw := utl_encode.BASE64_DECODE(utl_raw.CAST_TO_RAW(v_buffer_varchar));

dbms_lob.WRITEAPPEND(v_blob, utl_raw.LENGTH(v_buffer_raw), v_buffer_raw);

v_offset := v_offset + v_buffer_size-1;

end loop;

return v_blob;

end decode_base64;

因为不理解原理,我比较担心,虽然人眼看着是个完整的照片,但实际上照片数据是有损坏的,我不能保证这个脚本就是对的。

有个参考资料,是我原来的写法,我的证实,是错的,不要仿照:

http://www.dbforums.com/oracle/1624851-clob-blob.html

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐