Select não puxa dados com parametros fornecidos

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 no forúm
Surgiu um problema por aqui.
Estou puxando um select, com dois parametros.
Que retornam o seguintes dados(esses dados sempre mudam)
:parametro.valor := 2;
:parameter.dados := sum(decode(cd_item,'C',decode(vl_resultado,'+',1,0),0)) + sum(decode(cd_item,'c',decode(vl_resultado,'-',1,0),0)) ;

O select é esse

Selecionar tudo

select f.cd_pessoafisica 
     from dados f
   Where (f.cd_pessoafisica, f.nr_sequencial,:parameter.valor) in 
                                 (select distinct cd_pessoafisica, nr_sequencial, :parameter.dados
                                              from itens_dados
                                            group by cd_pessoafisica, nr_sequencial)
Quando faço dessa forma, por parametros, esse select não retorna nada.

Quando faço dessa forma, com os dados fixos

Selecionar tudo

select f.cd_pessoafisica 
     from dados f
   Where (f.cd_pessoafisica, f.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))
                                              from itens_dados
                                            group by cd_pessoafisica, nr_sequencial)

Será que alguém pode me ajudar, estou com esse problema e não consigo achar a solução.

Obrigada
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá priajf,

Acho que o problema aquí é que você está tentando colocar uma instrução dinâmica dentro da querie através de variáveis BIND.

Quando você informa:
:parametro.valor := 2;
:parameter.dados := sum(decode(cd_item,'C',decode(vl_resultado,'+',1,0),0)) + sum(decode(cd_item,'c',decode(vl_resultado,'-',1,0),0)) ;

O oracle está interpretando:

:parametro.valor => o valor "2"
:parameter.dados => um TEXTO (STRING) com o conteúdo "sum(decode(cd_item ....,0))"

Ou seja, ele está executando assim a querie:

Selecionar tudo

select f.cd_pessoafisica 
     from dados f
   Where (f.cd_pessoafisica, f.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))"
                                              from itens_dados
                                            group by cd_pessoafisica, nr_sequencial)
Ao invés de executar assim:

Selecionar tudo

select f.cd_pessoafisica 
     from dados f
   Where (f.cd_pessoafisica, f.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))
                                              from itens_dados
                                            group by cd_pessoafisica, nr_sequencial)
Não sei se entendeu, mas da forma que você desenvolveu, o oracle está comparando "2" com o texto "sum(decode..". Com certeza não vai encontrar nenhuma condições onde 2 é igual a um texto.

Se a sua querie faz parte de algum programa PL/SQL, a alternativa que você tem seria a de criar um comando SQL DINAMICO. Ou seja, você monta uma string com o comando SQL, adicionando o texto do decode e depois faz um EXECUTE IMMEDIATE deste comando.

Pesquise um pouco mais sobre "EXECUTE IMMEDIATE .. USING" .. você deve encontrar exemplos que lhe ajudarão a solucionar seu problema.

Se tiver dúvidas adicionais, fique à vontade para postar aqui.

Abraços,

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

Bom Dia Stcoutinho,
entendi sim,
porém fica complicado fazer por execute immediate, porque só por procedure não é??
Mas vou ver o que posso fazer aqui.

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

Dae Sergio Coutinho,
vê se você pode me ajudar...

Quero fazer uma quebra de texto, toda vez que tenho uma virgula.


Selecionar tudo

Este, texto, deve, ser, quebrado
Deverá ficar assim

Selecionar tudo

1 - Este
         2 - Texto
         3 - deve
         4 - ser
         5 - quebrado
Como eu faria?
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Oi Priaf,

Seria legal você abrir um novo tópico no FORUM sobre este tema, quando a pergunta nova não tiver muito a ver com a atual. Isso até permite que mais pessoas fiquem a par da sua dúvida e possam lhe ajudar.

Para resolver este novo problema, você precisaria usar funções REPLACE e CHR, a variável ROWNUM e caracteres de concatenação "||" (pipe - pípe).

O ROWNUM indica o numero da linha retornado na sua querie.

Mas só alertando: o ROWNUM nunca deve ser usado dentro do WHERE de uma querie se você tiver algum ORDER BY no mesmo SELECT.

Veja um exemplo de como criar uma numeração. Eu utilizo aqui o ROWNUM e o "||" para concatenar as informações:

Selecionar tudo

SQL> SELECT ROWNUM||' -' FROM DBA_OBJECTS WHERE ROWNUM < 4;  -- veja que não estou usando ORDER BY

ROWNUM||'-'
------------------------------------------
1 -
2 -
3 -
A função REPLACE lhe permite dentro de uma STRING substituir caracteres. Veja este exemplo:

Selecionar tudo

SQL> SELECT REPLACE('Este, texto, deve, ser, quebrado',',','#') FROM DUAL;

REPLACE('ESTE,TEXTO,DEVE,SER,QUE
--------------------------------
Este# texto# deve# ser# quebrado

SQL>
Agora, você quer que sua querie quebre linha .. você pode usar a função CHR. A função CHR lhe permite mostrar caracteres ASCII em suas queries. No caso do WINDOWS, uma quebra de linha corresponde ao caracteres ASCII "13" e "10". No caso do UNIX, desconfio que seja o ASCII 10.

Veja um exemplo de como você poderia usar esta função:

Selecionar tudo

SQL> SELECT 'Hello'||CHR(13)||CHR(10)||'WORLD !!' AS TEXTO FROM DUAL;

TEXTO
---------------
Hello
World !!
Com isso, você dispõe de todas as informações para poder montar o seu resultado. Utilize a função "REPLACE" para substituir a "," (virgula) por "CHR(13)||CHR(10)". Utilize o ROWNUM para fazer a numeração das linhas. E utilize o "||" para concatenar os resultados.

Um ponto adicional: se existem espaço em branco depois ou antes da vírgula e deseja remover eles, então você pode "encapsular" o seu REPLACE com um REPLACE externo, onde você substitue o espaço em branco com nada.

Selecionar tudo

Exemplo:
SELECT REPLACE(REPLACE( ..<aqui o replace que você precisa desenvolver> .. ),' ','') FROM DUAL;

Abraços e boa sorte,

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

Bom dia Stcoutinho,
Eu não vou separar num select, e sim uma validação no forms.
De um campo,
se eu digitar no campo v_verificar - 'OLÁ, MUNDO, AQUI'.
deverá separar. Mais não não conseguir chegar num conclusão.
Agradeço a ajuda
Responder
  • Informação
  • Quem está online

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