2012-11-30 4 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를 반환하고 RAW는 32kB로 제한되므로 RAW가 올바른 형식이 아닐 수도 있습니다. 이 데이터로 무엇을하고 싶습니까? 데이터를 어딘가에 복사 하시겠습니까? 서버에? 클라이언트에? ... –

+0

죄송합니다 당신을 위해 anwser 준비 시간은 없지만 당신에게 팁을 줄 것입니다. 32kb를 읽은 다음 파일 (utl_fiile.put_raw)에 쓰고, 다음에 32kb를 읽고, 파일에 쓰십시오. 당신이 5mbs를 쓰거나 blob을 끝낼 때까지 반복하십시오. 그러나 웨이브 파일에 특수한 파일 구조 (파일의 시작과 끝)가있어서 문제가 생길 수 있으므로 분할하는 것이 그리 쉽지는 않을 것입니다. 바이너리 분할 파일을 얻을 수 있습니다. –

+0

@ Vincent. 웨이브 파일의 일부를 포함하는 출력 매개 변수로 BLOB가있는 저장 프로 시저를 개발하려고합니다. 편집을 참조하십시오. –

답변

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

좋은 제안은 약간 변경해야하지만 올바른 방향으로 가져 왔습니다. 감사 –