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