quinta-feira, 18 de março de 2010

UTL_FILE

Então aqui estou novamente, desta vez vou escrever sobre a package UTL_FILE de uma forma simples e prática.

Esta package é responsável pela manipulação de arquivos, pode ser comparada, de certa forma, com a TEXT_IO do Forms/Reports.
Vou dar exemplos de criação de arquivos, leitura, manipulação, renomear, fazer cópias, etc.

Inicialmente, devemos ter um diretório criado no banco. No meu caso, estou desenvolvendo no Oracle XE configurado na minha máquina. Segue um script para setar um diretório.

create or replace directory my_dir
as 'C:\oraclexe\app\oracle\product\10.2.0\server\cure';


Após ter o seu diretório criado e configurado, podemos começar a utilizar o UTL_FILE. Segue alguns exemplos.

Criar um arquivo populando ele com duas linhas.
declare
  myfile utl_file.file_type;
begin
  myfile := utl_file.fopen('my_dir','teste.txt','W',32000); --este último parâmetro seta o tamanho da linha
  utl_file.put_line(myfile,'conteúdo linha 1',true);
  utl_file.put_line(myfile,'conteúdo linha 2',true);
  utl_file.fclose(myfile);
end;


Ler o arquivo e retornar o conteudo de cada linha.
declare
  myfile utl_file.file_type;
  conteudo varchar2(32000);
  conteudo_aux varchar2(32000);
begin
  myfile := utl_file.fopen('my_dir', 'teste.txt', 'R', 32000);
  loop
    begin
      utl_file.get_line(myfile, conteudo_aux, 32000);
    exception
    when no_data_found then
      exit;
    end;
    conteudo := conteudo||conteudo_aux||chr(10);
  end loop;
  dbms_output.put_line(conteudo);
  utl_file.fclose(myfile);
end;


Renomear um arquivo, com a possibilidade de alterar o diretório.

begin
utl_file.frename(src_location => 'my_dir',
                                src_filename => 'teste.txt',
                                dest_location => 'my_dir',
                                dest_filename => 'teste_renamed.txt',
                                overwrite => true);
end;


Remove um arquivo.
begin
  utl_file.fremove('my_dir','teste.txt');
end;


Copia o conteúdo de um arquivo para um novo arquivo, pode ser delimitado as linhasa ser copiadas, por exemplo, da linha 1 até a linha 12, veja o exemplo:
begin
utl_file.fcopy(src_location => 'my_dir',
                            src_filename => 'teste_renamed.txt',
                            dest_location => 'my_dir',
                            dest_filename => 'new_file.txt',
                            start_line => 1,
                            end_line => 12);
end;


A linha de comando "utl_file.fflush(myfile);" faz a função de salvar os dados gravados pelo put_line no arquivo, funciona como se fosse o save de algum editor de texto. o fflush é utilizado para gravar os dados durante o processo que popula. Os dados sao gravados definitivamente quando o comando utl_file.fclose(myfile); é executado.

O comando utl_file.fseek(... serve para se posicionar em um lugar específico do arquivo, ele recebe três parametros:

file => myfile,
absolute_offset => posição a ser procurada,
relative_offset => o número de bytes(posições) que deve ser procurado para frente ou para trás, considerando que: se o número for positivo procura pra frente, se for negativo, procura pra trás)

...
utl_file.fseek(myfile,
                        10,
                        -12);
...


Se tiverem dúvidas, coloquem no comentário.

2 comentários:

  1. Boa cure!!! muito bom os exemplos :) poem ai pro pessoal um exemplo de envio via ftp

    valeuu

    Att.
    André Mayer

    ResponderExcluir
  2. Opa! Salve!

    Eu tenho um arquivo texto de 4M de linhas e preciso colocar um header neste arquivo.

    Existe alguma maneira de fazer isso sem ler o arquivo inteiro e gravá-lo novamente com um put_line(xyz, meu_header) e depois efetuar um loop por todas as 4M de linhas?

    Luiz Araujo
    buchu.vp@gmail.com

    ResponderExcluir