Loop direto no select

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

Bom Dia Pessoal
Gostaria de uma ajuda,
Tenho um campo que digito várias informações.
Por exemplo. Teste, Campo, +

Queria fazer o seguinte

Selecionar tudo

v_where := v_where||v_sinal||'SUM(DECODE(CD_ITEM,'||V_ITEM||',DECODE(VL_RESULTADO,'||V_RESULTADO||',1,0),0))';
Como eu posso trazer esse sum(decode, rodar conforme o que foi digitado. Nesse campo sempre pode ser informações diferentes.
Tentei fazer da seguinte forma.

Selecionar tudo

 for i in ( select sum(decode(cd_item,v_item,decode(vl_resultado,v_resultado,1,0),0))aux
            ,cd_pessoafisica 
	            from dados_pf) loop 
Porém, ele faz somente pro primeira String 'teste', gostaria que fizesse um loop, para toda a string digitada.
Tenho umas validações antes que separa item por item.

Obrigda Pela atenção
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

Bom dia,
você quer executar uma query dinâmica?
Vamos ver se consegui entender.
Você quer realizar várias buscas através de um único campo de pesquisa.
E a cada virgula informada neste campo deve-se realizar uma pesquisa na tabela dados_pf.
é isso mesmo?
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

Exatamente,
a cada virgula, colocaria os dados naquelas sum, para dar um resultado.
OU seja, não iria trazer somente um

Selecionar tudo

sum(decode(cd_item,v_item,decode(vl_resultado,v_resultado,1,0),0))
Iria fazer de acordo com os dados digitados no campo.
O campo nunca é dados fixos.


C+,C-,
teria que fazer isso.

Selecionar tudo

sum(decode('C',v_item,decode('+',v_resultado,1,0),0)) +
sum(decode('C',v_item,decode('-',v_resultado,1,0),0))
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

você terá que construir dois loops.
O primeiro para percorrer a string da consulta(C+, C-) e o segundo com as informações de cada item.
Para cada iteração do primeiro loop, deve ser executado o segundo loop (dados_pf).
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

Eu tenho ele dessa forma, o que não consigo pensar num logica, é que ele não roda no select, quando coloco uma vez o sum........, já com o v_where, ele até roda, mais traz como string, não os resultado.

Tenho esse código, pronto de outra tela, Que faz a mesma coisa, porém tem um bloco de dados.
E na tela nova que estou fazendo, ele é só para pesquisa, sem mostrar na tela.

Selecionar tudo

 for i in 1..length(v_campo) loop
	     if substr(v_campo,i,1) in ('+','-') then
	      	v_resultado := substr(v_campo,i,1);
	     elsif substr(v_campo,i,1) = ',' then
	        if v_where is not null then
	        	v_sinal := ' + ';
	        end if;	
	        v_where := v_where||v_sinal||'SUM(DECODE(CD_ITEM,'||CHR(39)||V_ITEM||CHR(39)||',DECODE(VL_RESULTADO,'||CHR(39)||V_RESULTADO||CHR(39)||',1,0),0))'; 
	        v_item := null;	
	        v_resultado := null;
	     else
	     	  v_item := v_item||substr(v_campo,i,1);
	     end if;	  
	  end loop;


Na tela com bloco de dados
ele termina o código dessa forma.

Selecionar tudo

 v_where := '(cd_pessoafisica,nr_sequencial,'||v_num_campo||') in (SELECT distinct CD_PESSOAFISICA,nr_sequencial,'||v_where
	           ||' FROM dados_pf GROUP BY CD_PESSOAFISICA,NR_SEQUENCIAL)';
	
	  set_block_property('pessoa_fisica',default_where,v_where);
Espero que tenha entendido, minha cabeça está fazendo voltas com essa tela. :)
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

a query é executada?
Após a criação do default_where do bloco e execução do mesmo, recupere a string do default_where e cola aqui.
A query pode estar sendo construída errada.

Valeu
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

Sim ela funciona perfeitamente,
Mais ela faz com o execute_query;
Queria trazer ela igual, mais sem usar o execute_query, trazendo num select, algo dessa forma.
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

Há 2 maneiras para você descobrir a query que um bloco envia para o banco :
01) Force o bloco a falhar durante a consulta do execute query, assim, você pressiona SHIFT+F1 e recupera na integra a query executada;
02) A função get_block_property('NOME_BLOCO', LAST_QUERY) retorna o SQL Statement da última query executada.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

Tentei de várias formas, forçar um erro no bloco.
Mudei tipo de dados, da o erro, mais aparece outro q não consigo trazer o Shift + f1.
Sei que ele fez um select assim, digitei no campo, C+,c-,K+
o v_num_campo, é o calculo de quantos dados foram digitados, separado por virgula, nesse caso. seria igual a 3.

Selecionar tudo

select * 
from pessoa_fisica
where (cd_pessoafisica,nr_sequencial,v_num_campo) in 
(Select distinct cd_pessoafisica, nr_sequencial,
sum(decode(cd_item,'C',decode(vl_resultado,'+',1,0),0)) +
 sum(decode(cd_item,'c',decode(vl_resultado,'-',1,0),0)) +
sum(decode(cd_item,'K',decode(vl_resultado,'+',1,0),0))
from dados_pf
group by cd_pessoafisica, nr_sequencial)
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

Tora34

vê se consegue me ajudar,
fiz o

Selecionar tudo

get_block_property('MEU BLOCO', LAST_QUERY);
na tela q está rodando a query,
porém mando dar a mensagem. E não trás tudo, corta a metade,
sabe como faço pra trazer toda a query do last_query?
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

Consegui fazer aparecer toda a query rodada

Selecionar tudo

SELECT ROWID,--todos dados da tabela
 FROM pessoa_fisica
WHERE (cd_pessoafisica,nr_sequencial,2) in 
(SELECT distinct CD_PESSOAFISICA,nr_sequencial,
SUM(DECODE(CD_ITEM,'C',DECODE(VL_RESULTADO,'+',1,0),0)) + SUM(DECODE(CD_ITEM,'c',DECODE(VL_RESULTADO,'-',1,0),0)) total
FROM dados_pf 
GROUP BY CD_PESSOAFISICA,NR_SEQUENCIAL)
Mais lembrando que o total nunca é fixo.

É nessa parte que está dando dor de cabeça.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes