Pular para o conteúdo
  • Este tópico contém 3 respostas, 3 vozes e foi atualizado pela última vez 8 anos, 4 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #108234
    Avatar de Tadeu Rodrigues de OliveiraTadeu Rodrigues de Oliveira
    Participante

      Como posso rodar uma query que foi construída dinamicamente e armazenada em uma variável como segue no exemplo abaixo?
      Existe no ORACLE alguma função que faça isso?

      declare
      vCampos varchar2(20000); -- será montada conforme o resultado de uma outra query como abaixo
      vSQL_1 varchar2(20000); -- SELECT DISTINCT CAMPO_1 FROM TABELA2; onde o conteúdo do campo_1
      begin -- será utilizado como nome de coluna na vCampos.
      vCampos := '''Coluna_1 - N.''' || ', ' || '''Coluna_2 - N.''' || ', ' || '''Coluna_3 N.''' || ', ' || '''Coluna_n - N.''';
      vSQL_1 := '
      select * from
      (
      select campo1
      , campo2
      , campo3
      , campo4
      , campo5
      from tabela_x
      where campo1 = 1031
      and campo2 in (00,01,04)
      and campo3 in (1,130)
      )
      pivot
      (
      sum(campo5)
      for campo4 IN (' || vCampos || ')
      )
      order by 1, 3;';
      -- execute immediate(vSQL_1); Pensei que isso resolvesse mas não funciona
      end;

      #108235
      Avatar de spernegaspernega
      Participante

        Bom dia,

        Tente tirar o ; do order by
        deixe apenas order by 1, 3′;

        #108239
        Avatar de Tadeu Rodrigues de OliveiraTadeu Rodrigues de Oliveira
        Participante

          Já tentei e não funcionou, mesmo assim obrigado pela dica.

          #108276
          Avatar photoJosé Laurindo Chiappa
          Moderador

            Vamos pensar juntos : a tua query está retornando N linhas, com cada linha contendo 5 valores, que são as colunas campo1, campo2, campo3, campo4 e campo5… Vc DISSE PARA O RDBMS onde ele deve guardar cada valor retornando ? Não disse, então ele NÃO SABE o que fazer, onde guardar… Vc tem que ser ** EXPLÍCITO ** aqui, não tem Atalhos, não é assim que o SQL dinâmico foi programado/implementado no RDBMS Oracle…
            Outra coisa, vc vai retornar N linhas, então vai ter que ter N cópias das variáveis que vão conter cada valor de cada coluna – isso normalmente implica em se usar um ARRAY, essa é a estrutura na linguagem PL/SQL que pode receber N instâncias de dados…
            Vc acha um exemplo funcional em http://ergemp.blogspot.com.br/2014/12/fetching-multiple-rows-with-execute.html , okdoc ??

            Não foi a sua pergunta, mas vc Pode também usar REF CURSOR com SQL dinãmico, veja https://community.oracle.com/thread/549904?tstart=0 para uns exemplos…

            []s

            Chiappa

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