sql >> Base de Datos >  >> RDS >> Oracle

Ejemplo APEX_ZIP

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