UTL_COMPRESS uses the LZ compression (equivalent to gzip).
You take a source blob and get a resultant compressed on, eg
declare
l_log_blob blob;
l_uncompressed_blob blob;
begin
l_uncompressed_blob := ...
dbms_lob.createtemporary(l_log_blob,true);
utl_compress.lz_compress (src => l_uncompressed_blob,
dst => l_log_blob);
dbms_lob.freetemporary(l_log_blob);
dbms_lob.freetemporary(l_uncompressed_blob);
end;
/
and then any blob can be written to file via UTL_FILE
declare
l_gzip utl_file.file_type;
l_piece raw(32767);
l_chunklen number := 32767;
l_idx integer := 1;
l_blob_len integer;
begin
l_blob_len := dbms_lob.getlength(l_log_blob);
l_gzip := utl_file.fopen('blob_dir','myfile.dat.gz','wb', 32767);
while l_idx <= l_blob_len loop
dbms_lob.read(l_log_blob, l_chunklen, l_idx, l_piece);
utl_file.put_raw(l_gzip, l_piece, true);
l_idx := l_idx + l_chunklen;
end loop;
utl_file.fclose(l_gzip);
end;