split blob file

只愿长相守 提交于 2019-12-08 13:21:06

问题


I need to retrieve from the database a few large wave files and would like to retrieve divided into wave files smaller (about 5Mb). How can I do? I've seen the procedure dbms_lob.read, but this return maximum file size of 32Kb.

Regards

procedure extract_blob(p_id in number, wrote_length in out number, chunk out blob) is
   len_file binary_integer;
   myblob blob;
   myname varchar2(255);
   buffer_length number := 32760;

   begin    
     select file_wav_data, file_wav_name, dbms_lob.getlength(file_wav_data)
     into myblob, myname, lun_file 
     from t_wav 
     where id = p_id;

     if(len_file > wrote_length) then
         dbms_lob.read(myblob,buffer_length,wrote_length+1,chunk);
         wrote_length := wrote_length + buffer_length;
     else wrote_length := -999; --EOF
     end if;
   end;

回答1:


You probably want to use temporary LOBs:

procedure extract_blob(
    p_id in number,
    offset in number,
    chunk_length in out number,
    chunk out blob
) is
    chunk blob;
    wav_data blob;
    full_length number;
    chunk_length number;

begin    
    select file_wav_data, dbms_lob.getlength(file_wav_data)
    into wav_data, full_length
    from t_wav 
    where id = p_id;

    chunk_length := greatest(full_length - offset, 0);
    if chunk_length = 0 then
        return;
    end if;

    dbms_lob.createtemporary(chunk, TRUE);

    dbms_lob.copy(chunk, wav_data, chunk_length, 0, offset);

end extract_blob;

If possible, you should free the temporary LOB from the client side after you have processed it (using DBMS_LOB.FREETEMPORARY).



来源:https://stackoverflow.com/questions/13648830/split-blob-file

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!