Estava lendo na net artigos e dicas para aproveitar o máximo do Oracle, e acabei vendo esta matéria da Damaris Fanderuff mestre e doutoranda em Engenharia de Produção e Sistemas pela UFSC e bacharel em Ciência da Computação pela FURB, onde ela ensina a fazer um arquivo com os registros do banco de dados e depois a recuperalos pelo próprio oracle. Vou trocar a idéia do set serverout on por este método, muito melhor para logar alguma coisa ou mesmo para uma listagem de registros diários.
«artigo completo»
Leitura e Gravação em Arquivo Texto
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 especificados no parâmetro de inicialização, como UTL_FILE_DIR = nome_do_diretório ou *.
Observação: * especifica que qualquer diretório está acessível para as operações com arquivos.
|
Procedimentos da package UTL_FILE
|
Funcionalidade
|
|
FOPEN
|
abre um arquivo para entrada ou saída, criando um arquivo de saída caso o arquivo specificado não exista |
|
IS_OPEN
|
indica se determinado arquivo está ou não aberto
|
|
FCLOSE
|
fecha um arquivo |
|
FCLOSE_ALL
|
fecha todos os arquivos abertos
|
|
GET_LINE
|
lê uma linha de um arquivo aberto |
|
PUT
|
escreve uma linha no arquivo. Não acrescenta automaticamente o caractere de fim de linha
|
|
PUT_LINE
|
escreve uma linha no arquivo, acrescentando automaticamente o caractere de fim de linha
|
|
NEW_LINE
|
inclui o caractere de fim de linha no arquivo, o que irá gerar uma nova linha em branco
|
|
FFLUSH
|
escreve, fisicamente, todas as pendências para um arquivo
|
|
Exceções package UTL_FILE
|
Controle
|
| INVALID_PATH | diretório ou nome de arquivo inválido |
| INVALID_MODE |
o parâmetro de modo de abertura é inválido
|
| INVALID_FILEHANDLE | especificador de arquivo inválido |
| INVALID_OPERATION |
o arquivo não pode ser aberto ou a operação é inválida
|
| READ_ERROR |
ocorreu um erro do sistema operacional durante a leitura de um arquivo
|
| WRITE_ERROR |
ocorreu um erro do sistema operacional durante a gravação de um arquivo
|
| INTERNAL_ERROR | erro não especificado no PL/SQL |
| NO_DATA_FOUND |
nesse caso, é disparada quando o fim do arquico é encontrado em processamento de leitura seqüencial de um arquivo de texto
|
Roteiro para geração de arquivo texto:
DECLARE
arquivo_saida UTL_File.File_Type;
Cursor Cur_Linha is select to_char(sysdate,'dd/mm/yyyy hh24:mi:ss "século" CC') DATA from dual;
BEGIN
/*
A Append Text
AB Append Byte Mode
R Read Text
RB Read Byte Mode
W Write Text
WB Write Byte Mode
*/
arquivo_saida := UTL_File.Fopen('/home/oracle/','alfa.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;
Roteiro para leitura de arquivo texto:
DECLARE
arquivo_ler UTL_File.File_Type;
Linha Varchar2(100);
BEGIN
arquivo_ler := UTL_File.Fopen('caminho completo’,’nm arquivo', 'r');
Loop
UTL_File.Get_Line(arquivo_ler, Linha);
End Loop;
UTL_File.Fclose(arquivo_ler);
Dbms_Output.Put_Line('Arquivo processado com sucesso.');
EXCEPTION
WHEN No_data_found THEN
UTL_File.Fclose(arquivo_ler);
Commit;
WHEN UTL_FILE.INVALID_PATH THEN
Dbms_Output.Put_Line(‘Diretório inválido.');
UTL_File.Fclose(arquivo_ler);
WHEN Others THEN
Dbms_Output.Put_Line ('Problemas na leitura do arquivo.');
UTL_File.Fclose(arquivo_ler);
END;
Fonte: SQL Magazine
4