quarta-feira, 29 de dezembro de 2010

Oracle para Excel - Função para gerar arquivo texto

Apresento uma função que recebe um script, grava um arquivo texto e retorna um parâmetro com a quantidade de registros gravados. Para abrir este arquivo no Excel coloque no parâmetro P_SEPARADOR o valor CHR(9), código ASCII para a tecla TAB.
Para executá-la utilize o scritp abaixo:

O código abaixo foi atualizado e melhorado em 03/10/2012


   select dump_csv('select * from tmp_arsesp_14',
                   chr(9), --Separador
                   'N',  --Entre aspas Sim ou Não
                   '/work/dump',
                   'Arquivo.csv',
                   'N') --Cabeçalho Sim ou Não   
    from dual;



create or replace function dump_csv( p_query     in varchar2,
                                      p_separator in varchar2 default ',',
                                      p_aspas     in varchar2 default 'n',
                                      p_dir       in varchar2 ,
                                      p_filename  in varchar2 ,
                                      p_cabecalho in varchar2 default 's' )


return number
is
   TYPE tipoCursor IS REF CURSOR;
   cursorDinamico tipoCursor;
    l_output        utl_file.file_type;
    l_theCursor     integer default dbms_sql.open_cursor;
    l_columnValue   varchar2(20000);
    l_column        varchar2(20000);
    l_status        integer;
    l_colCnt        number default 0;
    l_separator     varchar2(10);
    l_cnt           number default 0;
    l_tabela        varchar2(50);
    l_char          char(1);
    i               integer;
    l_pos_ini       integer;
    l_pos_fin       integer;
    l_cabecalho     varchar2(20000);
    l_linha         varchar2(20000);
begin
    l_output := utl_file.fopen( p_dir, p_filename, 'w' );

     l_separator := p_separator;

   -- Tratando cabeçalho 
   ---------------------
   if upper(p_cabecalho) = 'S' then
     if   instr(p_query,'*') > 0 then
          -- Pego o nome da tabela
          for i in instr(lower(p_query),'from ')+5..50 loop
            l_char := substr(p_query,i,1);
            exit when (l_char is null);
              l_tabela := l_tabela || l_char;
          end loop;

          open cursorDinamico for select column_name
                                    from all_tab_cols
                                   where table_name = upper(l_tabela)
                                   order by column_id;
          -- Gravo todos os campos da tabela no arquivo de saída

          loop
              fetch cursorDinamico into l_column;
              exit when cursorDinamico%NOTFOUND;
              
              if upper(p_aspas) = 'S'  then
                 l_cabecalho := l_cabecalho || '''' || l_column || '''' || l_separator;
              else
                 l_cabecalho := l_cabecalho || l_column || l_separator;
              end if;
            
                          
                 --   l_cabecalho := l_cabecalho || l_column || l_separator;
          end loop;
          close cursorDinamico;
          l_cabecalho := trim(l_cabecalho);
          l_cabecalho := substr(l_cabecalho,1,length(l_cabecalho)-1);
          UTL_FILE.put (l_output,l_cabecalho);          
          utl_file.new_line (l_output);                                   
                                   
                                   
                                   
/*          -- Gravo todos os campos da tabela no arquivo de saída
          loop
              fetch cursorDinamico into l_column;
              exit when cursorDinamico%NOTFOUND;
                   UTL_FILE.put (l_output,l_column || l_separator);
          end loop;
          close cursorDinamico;
          utl_file.new_line (l_output);*/
     else
          --  Gravo todos os campos do select no arquivo de saída
          l_pos_ini := instr(p_query,' ') + 1;
          l_pos_fin := instr(lower(p_query),'from') - 1;
          l_column := substr(p_query,l_pos_ini, l_pos_fin - l_pos_ini);
          l_column := replace(l_column,' ','');
          l_column := replace(l_column,',',  l_separator);

         -- dbms_output.put_line (l_column);
          UTL_FILE.put_line (l_output,l_column);
     end if;
  end if;
    
  -- fim tratando cabecalho
  -------------------------
  
  
    dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );


    for i in 1 .. 255 loop
        begin
            dbms_sql.define_column( l_theCursor, i, l_columnValue, 2000 );
            l_colCnt := i;
        exception
            when others then
                if ( sqlcode = -1007 ) then exit;
                else
                    raise;
                end if;
        end;
    end loop;

    dbms_sql.define_column( l_theCursor, 1, l_columnValue, 2000 );


    l_status := dbms_sql.execute(l_theCursor);


    loop
        exit when ( dbms_sql.fetch_rows(l_theCursor) <= 0 );
        l_separator := p_separator;
        for i in 1 .. l_colCnt loop
            dbms_sql.column_value( l_theCursor, i, l_columnValue );
            if upper(p_aspas) = 'S'  then
              -- utl_file.put( l_output, '''' || l_columnValue || '''' || l_separator);
               l_linha := l_linha || '''' || l_columnValue || '''' || l_separator;
            else
              -- utl_file.put( l_output,   l_columnValue || l_separator);
               l_linha := l_linha || l_columnValue || l_separator;
            end if;
        end loop; 
            
        utl_file.put (l_output, substr(l_linha,1,length(l_linha)-1));
        l_linha := '';
        utl_file.new_line( l_output );
        l_cnt := l_cnt+1;
    end loop;


    dbms_sql.close_cursor(l_theCursor);


    utl_file.fclose( l_output );
    return l_cnt;
end dump_csv;



Nenhum comentário :

Postar um comentário

Related Posts Plugin for WordPress, Blogger...