Como Ler e Gravar arquivos textos pelo Oracle 10g ou superior

A idéia desse artigo é efetuar uma leitura e/ou gravação de um arquivo do tipo texto em um diretorio no servidor Oracle.

Os comandos necessários para o desenvolvimento de rotinas para ler e escrever dados em arquivos do tipo texto encontram-se na package-padrão UTL_FILE, disponível a partir da versão 7.3 do Oracle. Porém sua implementação estará sujeita às permissões do sistema operacional e do banco de dados, sendo que os diretórios que podem ser acessados para leitura e gravação devem ser concedidos ao criar um directory.

Primeiramente temos que entender um detalhe importante, o arquivo a ser lido e/ou gravado deverá estar no servidor Oracle, e não no cliente que estará chamando o procedimento. Não é possivel gerar o arquivo ou ler na maquina client, uma sugestão é após criar utilizar o smtp para envia-lo por email [Envio de E-mail através de PL/SQL].

Vamos para os detalhes importantes antes de criar o nosso procedimento:

Servidor Oracle em Linux
IP: 192.168.1.100

Diretorio no servidor que estará os arquivos:
/arquivos/oracle/

Somente o usuário oracle tem privilegios de ler e gravar no diretorio /arquivos/oracle no Sistema Operacional

No Oracle devemos criar um directory ligando o diretorio no Sistema Operacional.
Criado a partir do usuário system do oracle

SQL> show user
USER is "SYSTEM"
SQL> create directory ARQSYS as '/arquivos/oracle/';
Directory created.

Criando esse directory agora deve ser concedido o privilegio de gravar ou ler arquivos abaixo deste diretório para usuário(owner) que irá chamar a rotina.


SQL> grant read,write ON DIRECTORY ARQSYS to rafa;

Logado com o meu usuario rafa no banco de dados vamos a rotina a gravar um arquivo texto no diretorio /arquivos/oracle/

DECLARE
    arquivo_saida                    UTL_File.File_Type;
    Cursor Cur_Linha is select to_char(sysdate,'dd/mm/yyyy hh24:mi:ss "seculo" CC') DATA from dual;

BEGIN
    arquivo_saida := UTL_File.Fopen('ARQSYS ','teste.txt', 'W');
    For Reg_Linha in Cur_linha Loop
        UTL_File.Put_Line(arquivo_saida, Reg_linha.Data);
    End Loop;
    UTL_File.Fclose(arquivo_saida);
    Dbms_Output.Put_Line('Arquivo gerado com sucesso.');
EXCEPTION
      WHEN UTL_FILE.INVALID_OPERATION THEN
               Dbms_Output.Put_Line('Operação inválida no arquivo.');
               UTL_File.Fclose(arquivo_saida);
      WHEN UTL_FILE.WRITE_ERROR THEN
               Dbms_Output.Put_Line('Erro de gravação no arquivo.');
               UTL_File.Fclose(arquivo_saida);
      WHEN UTL_FILE.INVALID_PATH THEN
               Dbms_Output.Put_Line('Diretório inválido.');
               UTL_File.Fclose(arquivo_saida);
      WHEN UTL_FILE.INVALID_MODE THEN
               Dbms_Output.Put_Line('Modo de acesso inválido.');
               UTL_File.Fclose(arquivo_saida);
      WHEN Others THEN
               Dbms_Output.Put_Line('Problemas na geração do arquivo.');
               UTL_File.Fclose(arquivo_saida);
END;

Estamos utilizando a function utl_file.fopen com os seguintes parametros

UTL_FILE.FOPEN (
   location     IN VARCHAR2,
   filename     IN VARCHAR2,
   open_mode    IN VARCHAR2,
   max_linesize IN BINARY_INTEGER) 
  RETURN file_type;

Onde o location é a localização / diretorio que encotra-se o arquivos.
filename é o nome do arquivo sem o path do diretorio.
open_mode especifica o modo que será lido ou gravado o arquivo:
r — read text
w — write text
a — append text
rb — read byte mode
wb — write byte mode
ab — append byte mode
Se você tentar abrir o arquivo especificando ‘a’ ou ‘ab’ para o open_mode mas o arquivo não existir, o arquivo será criado e gravado.
max_linesize Máximo de caracteres por linha, incluindo o caracter de nova linha (minimo de 1 e máximo de 32767). default é 1024.

OBS.: Lembrando que o arquivo está salvo no servidor Oracle (192.168.1.100) no diretorio do linux /arquivos/oracle/

Fonte de referencia: UTL_FILE 10g

%name Como Ler e Gravar arquivos textos pelo Oracle 10g ou superior

Autor: Rafael Stoever

Bacharel em Sistema de Informação pela Uniasselvi, atualmente cursando Gerenciamento de Projetos em TI pela Pós Graduação Uniasselvi. Atuo como Analista de suporte a banco de dados – DBA pela Lumina Serviços em TI residente de Blumenau/ SC, OPN Certified Specialist, Certificado OCP 10g/11g/12c, OCE RAC10g e Linux 10g. Conhecimentos em Microsoft SqlSever, Mysql e programação web (php,asp).