Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Exemplo de APEX_ZIP


No Oracle 12c em diante, no qual o Oracle Apex está instalado por padrão, você pode usar APEX_ZIP Pacote PL/SQL para compactar os arquivos. Então aqui estou dando alguns Oracle APEX_ZIP exemplos:

Exemplo do Oracle APEX_ZIP


O seguinte código PL/SQL obtém os arquivos (BLOB ) de uma tabela e compacta-a, e fornece um BLOB final que tem todos os arquivos que você adicionou.
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;

Você pode ver no código acima que no final, você obterá o BLOB final que você pode armazenar na tabela ou enviá-lo para um procedimento ou gravar um arquivo no servidor.

O exemplo a seguir é uma adição ao código acima. Depois de compactar os arquivos, ele gravará o arquivo zip no servidor.

Arquivos Zip usando o pacote APEX_ZIP e Gravar no Servidor


Para gravar o arquivo no servidor, você precisa de um objeto Oracle Directory. Abaixo segue um exemplo de como criar um objeto de diretório no Oracle apontando para um diretório no servidor.
Create or Replace directory my_dir as '/your/server/path';

Depois de criar o diretório, você pode escrever o arquivo zip conforme mostrado no exemplo abaixo:
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;

Após executar o código PL/SQL acima, você encontrará o arquivo my_zip.zip no MY_DIR localização do diretório no servidor.

Tutoriais relacionados:

  • Como obter o BLOB do arquivo em PL/SQL?
  • Como descompactar um arquivo em PL/SQL?

Referência:

  • Manual Oracle APEX_ZIP