Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Extração do Oracle BLOB muito lenta


Tenho certeza de que você não deve buscar todos os BLOBs em uma matriz no início do procedimento. Como você lê os dados do BLOB e nunca fecha nenhum localizador de lob, o Oracle precisa manter todas essas informações na memória. Eu diria que este é um caso de sobrecarga de memória.

Tente isso em vez disso:
CURSOR cc IS (SELECT ...)
BEGIN
   OPEN cc;
   LOOP
      FETCH cc
         INTO l_fname, l_blob;
      EXIT WHEN cc%NOTFOUND;
      l_blob_len := DBMS_LOB.getlength(l_blob);
      DBMS_OUTPUT.PUT_LINE(l_blob_len);
      l_file := UTL_FILE.fopen('BLOBS', l_x || '_' || l_fname, 'w', 32767);
      l_pos  := 1;
      l_x    := l_x + 1;
      WHILE l_pos < l_blob_len LOOP
         DBMS_LOB.READ(l_blob, l_amount, l_pos, l_buffer);
         UTL_FILE.put_raw(l_file, l_buffer, TRUE);
         l_pos := l_pos + l_amount;
      END LOOP;
      UTL_FILE.fclose(l_file);
   END LOOP;
   CLOSE cc;
END;