Criei uma procedure que recebe como parametro apenas o caminho onde os arquivos deveriam ser gerados. A principio seria simples, são duas queries onde a segunda trabalha com o resultado da primeira. A primeira query traz o código de todos os perfis existentes na base e cria um arquivo excel para cada código, a segunda query pegaria o codigo de cada perfil e buscaria todas as funções vinculadas a ele jogando o reultado para o excel correspondente. Porém isso não ocorre, e a planilha sai com a fomatação desconfigurada. Segue o codig que utilizei: create or replace procedure TS.SEGLOG_REVALIDA_PERFIS(p_diretorio in VARCHAR) is v_caminho varchar2(2000); v_data_ini_aux varchar2(10); v_nome_arquivo1 varchar2(100); v_diretorio varchar2(1000); simprime varchar(1); -- Pacote para trabalhar com arquivo fhandler utl_file.file_type; begin simprime := 'S'; v_diretorio := p_diretorio; v_data_ini_aux := to_char(sysdate , 'yyyymmdd'); --------------------------------------------- -- LISTA PERFIS DO SISTEMA - -------------------------------------------- FOR PERFIL_DATA IN (SELECT COD_PERFIL FROM TS_SEC.PERFIL) LOOP v_nome_arquivo1 := PERFIL_DATA.COD_PERFIL || '.csv'; fhandler := utl_file.fopen(v_diretorio, v_nome_arquivo1, 'w'); --------------------------------------------- -- LISTA AS FUNCOES DE CADA PERFIL - -------------------------------------------- begin for c_cursor in (SELECT AU.COD_FUNCAO , MO.NOM_MODULO , FU.TXT_TITULO_FUNCAO , AU.IND_INCLUSAO , AU.IND_ATUALIZACAO , AU.IND_EXCLUSAO , AU.IND_CONSULTA , AU.IND_ESPECIAL , AU.IND_EXECUCAO FROM TS_SEC.AUTORIZACAO_PERFIL AU , TS_SEC.FUNCAO FU , TS_SEC.MODULO MO WHERE AU.COD_PERFIL = PERFIL_DATA.COD_PERFIL AND FU.COD_FUNCAO = AU.COD_FUNCAO AND AU.COD_MODULO = MO.COD_MODULO AND FU.COD_MODULO = MO.COD_MODULO) loop if simprime = 'S' then utl_file.put_line(fhandler, '<html>'); utl_file.put_line(fhandler, '<style type="text/css">'); utl_file.put_line(fhandler, ' .FmtTexto {mso-number-format:\@}'); utl_file.put_line(fhandler, '</style>'); utl_file.put_line(fhandler, '<body >'); utl_file.put_line(fhandler, '<table width="100%" border="1" cellspacing="0" cellpadding="0">'); utl_file.put_line(fhandler, '<tr>'); utl_file.put_line(fhandler, '<td bgcolor="ccffcc"><b>CODIGO_FUNCAO</b></td>'); utl_file.put_line(fhandler, '<td bgcolor="ccffcc"><b>NOME_MODULO</b></td>'); utl_file.put_line(fhandler, '<td bgcolor="ccffcc"><b>TITULO_FUNCAO</b></td>'); utl_file.put_line(fhandler, '<td bgcolor="ccffcc"><b>INCLUI</b></td>'); utl_file.put_line(fhandler, '<td bgcolor="ccffcc"><b>ATUALIZA</b></td>'); utl_file.put_line(fhandler, '<td bgcolor="ccffcc"><b>EXCLUI</b></td>'); utl_file.put_line(fhandler, '<td bgcolor="ccffcc"><b>CONSULTA</b></td>'); utl_file.put_line(fhandler, '<td bgcolor="ccffcc"><b>FUNCAO_ESPECIAL</b></td>'); utl_file.put_line(fhandler, '<td bgcolor="ccffcc"><b>EXECUTA</b></td>'); utl_file.put_line(fhandler, '</tr>'); simprime := 'N'; end if; utl_file.put_line(fhandler, '<tr>'); utl_file.put_line(fhandler, ' <td >' || c_cursor.cod_funcao || '</td>'); utl_file.put_line(fhandler, ' <td >' || c_cursor.nom_modulo || '</td>'); utl_file.put_line(fhandler, ' <td >' || c_cursor.txt_titulo_funcao || '</td>'); utl_file.put_line(fhandler, ' <td >' || c_cursor.ind_inclusao || '</td>'); utl_file.put_line(fhandler, ' <td >' || c_cursor.ind_atualizacao || '</td>'); utl_file.put_line(fhandler, ' <td >' || c_cursor.ind_exclusao || '</td>'); utl_file.put_line(fhandler, ' <td >' || c_cursor.ind_consulta || '</td>'); utl_file.put_line(fhandler, ' <td >' || c_cursor.ind_especial || '</td>'); utl_file.put_line(fhandler, ' <td >' || c_cursor.ind_execucao || '</td>'); utl_file.put_line(fhandler, '</tr>'); end loop; end; utl_file.put_line(fhandler, ' </body></html>'); utl_file.fclose(fhandler); end loop; end;