› Fóruns › SQL e PL/SQL › Como rodar uma query contida em uma variável?
- Este tópico contém 3 respostas, 3 vozes e foi atualizado pela última vez 9 anos, 10 meses atrás por
José Laurindo Chiappa.
-
AutorPosts
-
29 de junho de 2016 às 11:50 pm #108234
Tadeu Rodrigues de Oliveira
ParticipanteComo 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;
30 de junho de 2016 às 3:49 pm #108235spernega
ParticipanteBom dia,
Tente tirar o ; do order by
deixe apenas order by 1, 3′;30 de junho de 2016 às 10:37 pm #108239Tadeu Rodrigues de Oliveira
ParticipanteJá tentei e não funcionou, mesmo assim obrigado pela dica.
7 de julho de 2016 às 3:19 am #108276José Laurindo Chiappa
ModeradorVamos 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
-
AutorPosts
- Você deve fazer login para responder a este tópico.
› Fóruns › SQL e PL/SQL › Como rodar uma query contida em uma variável?