Pular para o conteúdo
Visualizando 15 posts - 1 até 15 (de 19 do total)
  • Autor
    Posts
  • #87111
    mpvargas
    Participante

      Caros Amigos,
      Estou tentando criar uma instrução SQL para gerar arquivos .TXT pelo SPOOL do SqlPlus no seguinte lay-out:

      SPOOL /temp/tabela1.txt
      SELECT CAMPO1, CAMPO2, CAMPO3, CAMPO4, CAMPO5
      FROM tabela1
      SPOOL OFF;

      Como são muitas tabelas, estou tentando criar um script para fazer de forma automática. Fiz o script abaixo:

      Select ‘SELECT ‘ || COLUMN_NAME || ‘, ‘
      From DBA_TAB_COLUMNS Where Table_name = ‘Tabela1’
      Order by COLUMN_NAME;

      Resultado:
      SELECT CAMPO1,
      SELECT CAMPO2,
      SELECT CAMPO3,

      Eu não quero que o SELECT se repita e preciso colocar a opção TO_CHAR para quando o campo for numérico.

      Obrigado pela ajuda.

      #87114
      eversonpiza
      Participante

        mpvargas,

        A única forma que conheço de fazer isso é usando SQL Dinâmico.

        #87116
        Avatar photoLeonardo Litz
        Participante

          cara vc vai ter que gerar o select dinamicamente coisa do tipo

          declare

          v_query varchar2(400);
          v_coluna varchar2(4000);
          v_tabela varchar2(30) := ‘TABELA_NOME’;
          v_user varchar2(30) := user;

          begin

          for dd in (select a.column_name
          from all_tab_cols a
          where a.table_name = v_tabela
          and a.owner = v_user) loop

               v_coluna := v_coluna||','||dd.column_name;
          

          end loop;

          v_coluna := substr(v_coluna,2);

          dbms_output.put_line(‘select ‘||v_coluna||’ from ‘||v_tabela);

          end;

          Vlw Leonardo Litz

          #87118
          marlontk
          Participante

            Cara quando se esta usando o sqlplus é possivel desabilitar as configurações da sesão utilizando o comando set.
            Comandos tipo SET
            SET NEWPAGE 0
            SET SPACE 0
            SET LINESIZE 80
            SET PAGESIZE 0
            SET ECHO OFF
            SET FEEDBACK OFF
            SET HEADING OFF
            no teu caso tu podes utilizar

            SET Pagesize 0;

            #87120
            mpvargas
            Participante

              Litz,
              Eu consegui executar o procedimento, mas como faço para exibir o resultado?
              Obrigado.

              #87137
              Avatar photoLeonardo Litz
              Participante

                cara use o dbms_output.put_line, ou htp.p…

                #87141
                eversonpiza
                Participante

                  O problema é que o dbms_)output.put_line tem limitação, se não me engano de 1 milhão de bytes, que se o resultado por muito extenso pode estourar.

                  Uma sugestão é criar uma tabela temporária, e vai inserido a ‘saída’ nesta tabela, e depois faz um select com spool nela, assim não tem problema de limitação

                  Atn,
                  Everson

                  #87143
                  mpvargas
                  Participante

                    Já tem essa linha no final do procedimento

                    dbms_output.put_line(‘select ‘||v_coluna||’ from ‘||v_tabela);

                    Não deveria aparecer o resultado?

                    O resultado não é grande, pois apontei somente para uma tabela.

                    #87145
                    eversonpiza
                    Participante

                      Na verdade esse dbms_output vai jogar o select na tela, não o resultado dele.

                      Seguindo essa linha de raciocínio vc deveria fazer algo do tipo.

                      ….
                      spool comandos.sql
                      dbms_output.put_line(‘select ‘||v_coluna||’ from ‘||v_tabela);
                      spool off
                      ….

                      @comandos. sql

                      Desta forma, vai ser gerando um arquivo ‘comandos.sql’ com os selects que vc precisa, é só chama-la, setando as devidas configurações que o colega marlontk citou, que vc terá o resultado esperado.

                      #87149
                      marlontk
                      Participante

                        Ola mpvargas
                        Conseguiu resolver o teu problema?
                        Uma coisa que eu não entendi é se voce quer ver a estrutura ou os dados de todas as tables.
                        Se voce quer ver a estrutura voce pode utilizar duas views user_tables e user_tab_columns
                        exemplo

                        select c.table_name tabElA,u.COLUMN_NAME coluna ,u.DATA_TYPE tipo,U.DATA_LENGTH
                        from user_tables c,
                        user_tab_columns u
                        where c.table_name = u.TABLE_NAME

                        caso queira os dados ai complica um pouco mais… se for posta que dou uma olhada como fazer.

                        At+

                        #87150
                        Avatar photoLeonardo Litz
                        Participante

                          Marlontk

                          Tenta assim:

                          declare

                          v_query varchar2(400);
                          v_coluna varchar2(4000);
                          v_tabela varchar2(30) := ‘ITENS_NOTA’;
                          v_user varchar2(30) := user;
                          v_linha dbms_sql.Varchar2_Table;
                          c number;

                          begin

                          c := 0;

                          for dd in (select a.column_name
                          from all_tab_cols a
                          where a.table_name = v_tabela
                          and a.owner = v_user) loop

                          c := c +1;
                          v_linha(c) := ‘,’||dd.column_name;

                          end loop;

                          if(v_linha.count > 0)then
                          v_linha(1) := substr(v_linha(1),2);

                          dbms_output.put_line('select '); 
                          for dd in 1..v_linha.count loop
                          dbms_output.put_line(v_linha(dd));
                          end loop;
                          dbms_output.put_line('from '||v_tabela); 
                          

                          end if;

                          end;

                          sobre o disseram do tamanho do buffer o dbms_output, vc aumenta ele antes.

                          Vlw Leonardo Litz

                          #87151
                          marlontk
                          Participante

                            Litz
                            Gerou os comandos certinhos, so para resolver o problema todo colocaria um cursor antes para buscar todos os nomes das tables de um determinado usuario e ai ir mudando valor da tua variavel v_tabela para a tabela que o cursor achou.
                            Isto apenas para mostrar todas as tabelas de um determinado usuario por exemplo.
                            Quanto ao limite do DBMS_OUTPUT

                            Acho que o comando é set serveroutput valor;
                            onde o valor é o tamanho do buffer.

                            #87154
                            Avatar photoLeonardo Litz
                            Participante

                              Isso mesmo cara.
                              Só não esqueca de zerar a variavel c a cada passagem do loop superior.

                              Vlw Leonardo Litz

                              #87158
                              mpvargas
                              Participante

                                Marlontk,
                                Resolvi o problema em parte.
                                Estou tentando fazer algo de forma mais automatizada.
                                Usamos o ERP da Microsiga, e eu tenho um script que exporta algumas tabelas para TXT… e o Analista que mexe com a folha de pagamento utiliza essas tabelas em TXT para outros trabalhos.
                                Qual o meu problema então?
                                A versão que usamos da Microsiga é o Protheus8, e vamos migrar para o Protheus10… só que a estrutura das tabelas é diferente.
                                Por exemplo, a tabelas SRV010 (versão atual) tem 63 campos e a mesma tabela para a versão nova tem 74 campos.
                                Já temos a versão nova numa base teste, então preciso comparar a tabela SRV010 com a tabela SRV020… só que tenho que fazer isso com mais ou menos umas 80 tabelas.

                                Preciso comparar TABELAS DIFERENTES em INSTANCIAS DIFERENTES

                                #87160
                                marlontk
                                Participante

                                  Mpvargas,
                                  tem alguma relacao(regra) entre os nomes tipo

                                  SRV010 com a tabela SRV020 como tu mostrou so modificou o numero 10 para o 20 ou os nomes são bem diferentes?

                                Visualizando 15 posts - 1 até 15 (de 19 do total)
                                • Você deve fazer login para responder a este tópico.