Je suis presque sûr que vous ne devriez pas récupérer tous les BLOB dans un tableau au début de la procédure. Étant donné que vous lisez les données BLOB et que vous ne fermez jamais aucun localisateur de lob, Oracle doit conserver toutes ces informations en mémoire. Je suppose qu'il s'agit d'un cas de surcharge de mémoire.
Essayez ceci à la place :
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;