Segue exemplo de programa para tratamento de arquivos utilizando o pacote do Oracle utl_file. Neste programa, considero que as configuracoes de diretorio Oracle e permissoes dos diretorios no servidor ja estejam parametrizadas.create or replace procedure exemplo_utl_file_grava isl_arq utl_file.file_type;l_nome_arq varchar2(250);l_linha varchar2(250);l_conta varchar2(250) := 'inicio';l_conta_ant varchar2(250) := 'fim'; procedure p_abre_arquivo(l_arq in out utl_file.file_type, l_nome_arq in varchar2) is begin l_arq := null; l_arq := utl_file.fopen('INTERFACE',l_nome_arq,'W'); exception when others then dbms_output.put_line('Erro ao abrir o arquivo'); end p_abre_arquivo; procedure p_grava_linha(l_arq in out utl_file.file_type,l_linha varchar2) is begin if length(l_linha) = 240 then utl_file.put_line(l_arq,l_linha); utl_file.fflush(l_arq); else dbms_output.put_line('Erro linha com tamanho invalido'); dbms_output.put_line(l_linha); raise_application_error(20001, 'Erro linha com tamanho invalido'); end if; end p_grava_linha; procedure p_fecha_arquivo(l_arq in out utl_file.file_type) is begin utl_file.fclose(l_arq); exception when others then dbms_output.put_line('Erro ao fechar o arquivo'); end p_fecha_arquivo;beginnull; for r in (select 'conta' nome_conta, 'banco' BAN_CODIGO from dual tab_temp order by 1-- por conta )loop if r.nome_conta <> l_conta_ant then if 'fim' <> l_conta_ant then -- trailler lote l_linha := lpad(r.BAN_CODIGO,3,'0')|| --Codigo do banco. '0000'|| --Lote de servico '0'|| --Tipo de Registro lpad(' ',1,' '); --Uso Exclusivo FEBRABAN / CNAB p_grava_linha(l_arq,l_linha); -- fecha o arquivo p_fecha_arquivo(l_arq); end if; -- abre um novo arquivo. l_conta_ant := r.nome_conta; p_abre_arquivo(l_arq,'ARQ_'||l_conta_ant); -- monta os cabecalhos de arquivo e lote. -- header arq l_linha := lpad(r.BAN_CODIGO,3,'0')|| --Codigo do banco. '0000'|| --Lote de servico '0'|| --Tipo de Registro lpad(' ',9,' '); --Uso Exclusivo FEBRABAN / CNAB p_grava_linha(l_arq,l_linha); end if; -- linha do arquivo l_linha := lpad(r.BAN_CODIGO,3,'0')|| --Codigo do banco. '0000'|| --Lote de servico '0'|| --Tipo de Registro lpad(' ',9,' '); --Uso Exclusivo FEBRABAN / CNAB p_grava_linha(l_arq,l_linha); end loop; if 'fim' <> l_conta_ant then -- trailler lote l_linha := lpad(r.BAN_CODIGO,3,'0')|| --Codigo do banco. '0000'|| --Lote de servico '0'|| --Tipo de Registro lpad(' ',1,' '); --Uso Exclusivo FEBRABAN / CNAB p_grava_linha(l_arq,l_linha); -- fecha o arquivo p_fecha_arquivo(l_arq); end if;end exemplo_utl_file_grava;/ O desempenho de programas desenvolvidos em PLSQL e amplamente discutido, no que diz respeito a construcao dos sistemas, a maioria das aplicacoes e projetada sem considerar as flutuacoes e o aumento de volume das bases de dados e e comum que elas apresentem desempenhos ruins e diferentes, ate quando temos ambientes de configuracao e capacidades similares, isso porque sao variados os fatores que influenciam na performance dos programas. Porem, em linhas gerais, aplicacoes "bem construidas" sao menos suscetiveis a estas interferencias. Algumas vezes fui chamado a intervir em programas com "ma" performance e depois de analisar as especificacoes recomendadas pelo fabricantes descobri em conjunto com a equipe de DBAs que a base de dados nao estava seguindo as recomendacoes do fabricante do sistema, no que diz respeito a area de processamento temporario "temp tablespace", segmentos de rollback, "undo tablespace", redo log, etc. Na maioria das ocasioes, a intervencao e necessaria no codigo do programa, neste sentido, tenho sempre comigo este manual de construcao de programas da Oracle (Performance Tunning Guide), e um rascunho que fiz quando o estudei pela primeira vez, que compartilho aqui com voces. Este rascunho ajuda bastante na analise da estrutura dos comandos e nos hints, instrucoes para o interpretador PLSQL do banco de dados, para evitar intervencoes muito drasticas nos programas.