En Oracle 12c en adelante, en los que Oracle Apex está instalado de forma predeterminada, puede usar APEX_ZIP Paquete PL/SQL para comprimir los archivos. Así que aquí estoy dando algunos Oracle APEX_ZIP ejemplos:
Ejemplo de Oracle APEX_ZIP
El siguiente código PL/SQL obtiene los archivos (BLOB ) de una tabla y comprímalo, y le da un BLOB final que tiene todos los archivos que agregó.
declare
b_zip_file blob;
cursor c_files
is
select file_name,
file_content
from emp_files
where empno = 7894;
begin
for c in c_files
loop
-- adds the each blob to b_zip_file blob one by one
apex_zip.add_file (
p_zipped_blob => b_zip_file,
p_file_name => c.file_name,
p_content => c.file_content );
end loop;
-- finalizes the blob
apex_zip.finish (
p_zipped_blob => b_zip_file );
end;
Puede ver en el código anterior que al final obtendrá el BLOB final que puede almacenar en la tabla o enviarlo a un procedimiento o escribir un archivo en el servidor.
El siguiente ejemplo es una adición al código anterior. Después de comprimir los archivos, escribirá el archivo zip en el servidor.
Comprimir archivos usando el paquete APEX_ZIP y escribir en el servidor
Para escribir el archivo en el servidor, necesita un objeto de Oracle Directory. A continuación se muestra un ejemplo de cómo crear un objeto de directorio en Oracle que apunte a un directorio en el servidor.
Create or Replace directory my_dir as '/your/server/path';
Después de crear el directorio, puede escribir el archivo zip como se muestra en el siguiente ejemplo:
declare
b_zip_file blob;
-- variables for writing the files
l_file UTL_FILE.file_type;
l_buffer RAW (32767);
l_amount BINARY_INTEGER := 32767;
l_pos INTEGER := 1;
l_blob_len INTEGER;
-- end variable declaration for file
cursor c_files
is
select file_name,
file_content
from emp_files
where empno = 7894;
begin
for c in c_files
loop
-- adds the each blob to b_zip_file blob one by one
apex_zip.add_file (
p_zipped_blob => b_zip_file,
p_file_name => c.file_name,
p_content => c.file_content );
end loop;
-- finalizes the blob
apex_zip.finish (
p_zipped_blob => b_zip_file );
-- write the file
l_blob_len := DBMS_LOB.getlength (b_zip_file);
l_file :=
UTL_FILE.fopen ('MY_DIR',
'my_zip.zip',
'WB',
32767);
WHILE l_pos < l_blob_len
LOOP
DBMS_LOB.read (b_zip_file,
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;
Después de ejecutar el código PL/SQL anterior, encontrará el archivo my_zip.zip en el MY_DIR ubicación del directorio en el servidor.
Tutoriales relacionados:
- ¿Cómo obtener BLOB de un archivo en PL/SQL?
- ¿Cómo DESCOMPRIMIR un archivo en PL/SQL?
Referencia:
- Manual de Oracle APEX_ZIP