2012-11-30 35 views
0

我需要從數據庫中檢索幾個大的波形文件,並希望檢索分爲較小的波形文件(大約5Mb)。我能怎麼做?我已經看到過程dbms_lob.read,但是這返回最大文件大小爲32Kb。split blob文件

問候

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; 
+0

'dbms_lob.read'返回一個RAW,原始數據被限制爲32kB,所以RAW可能不是正確的格式。你想用這些數據做什麼?你想在某處複製數據嗎?在服務器上?在客戶端?... –

+0

對不起沒有時間爲你準備一個安納瑟爾,但我會給你一個小費。讀取32kb,然後將其寫入文件(utl_fiile.put_raw),讀取下一個32kb,將其寫入文件..在循環中執行此操作,直到您寫入您的5mbs或blob結束。但是可能存在一個問題,即wave文件具有特殊的文件結構(文件的開頭和結尾),因此僅僅分割文件就不那麼容易了 - 您將得到一個二進制分割文件。 –

+0

@Vincent。我想開發一個存儲過程,它有一個BLOB作爲包含wave文件一部分的輸出參數。查看編輯。 –

回答

2

您可能需要使用臨時的LOB:

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; 

如果可能的話,你應該擺脫你處理後,客戶端的臨時LOB(使用DBMS_LOB.FREETEMPORARY)。

+0

好的建議,我不得不做一些更改,但是你讓我朝着正確的方向前進。謝謝 –