Chiappa,

no caso ao executar ele pergunta ao usuario duas vezes.
Exemplo se ele quizer digitar A, vai ter que informar A duas vezes..

Seria isso mesmo?


Em 23/12/09, José Laurindo <jlchia...@yahoo.com.br> escreveu:
>
>
>
> Só pra ficar + claro, segue um exemplo (com banco XE e uma das tabelas
> demo, mas a idéia é a mesma se fosse um join) :
>
> => Primeiro vamos checar os dados :
>
> sys...@xe:SQL>ed
> Gravou file afiedt.buf
>
> 1 select employee_id, salary, department_id, commission_pct
> 2* from employees where salary > 10000
> sys...@xe:SQL>/
>
> EMPLOYEE_ID SALARY DEPARTMENT_ID COMMISSION_PCT
> ----------- ---------- ------------- --------------
> 100 24000 90
> 101 17000 90
> 102 17000 90
> 108 12000 100
> 114 11000 30
> 145 14000 80 ,4
> 146 13500 80 ,3
> 147 12000 80 ,3
> 148 11000 80 ,3
> 149 10500 80 ,2
> 162 10500 80 ,25
> 168 11500 80 ,25
> 174 11000 80 ,3
> 201 13000 20
> 205 12000 110
>
> 15 linhas selecionadas.
>
> ==> OK, quer dizer que pra alguns registros o campo de comissão é nulo, pra
> outros não... Vamos fazer uma lógica semelhante à sua, se a var lexical
> (sqlplus aceita, claro) for A quero que a condição seja que a coluna é nula,
> se a vaar for C quero que a condição seja não-nula :
>
> sys...@xe:SQL>l
> 1 select employee_id, salary, department_id, commission_pct
> 2 from employees
> 3 where salary > 10000
> 4 and ( ('&&v_teste' = 'A' and commission_pct is null)
> 5 OR ('&&v_teste' = 'C' and commission_pct is NOT null)
> 6* )
> sys...@xe:SQL>/
> Informe o valor para v_teste: A
>
> EMPLOYEE_ID SALARY DEPARTMENT_ID COMMISSION_PCT
> ----------- ---------- ------------- --------------
> 100 24000 90
> 101 17000 90
> 102 17000 90
> 108 12000 100
> 114 11000 30
> 201 13000 20
> 205 12000 110
>
> 7 linhas selecionadas.
>
> ==> Ok, limpo a var e rodo de novo, agora informando C :
>
> sys...@xe:SQL>undefine v_teste
> sys...@xe:SQL>l
> 1 select employee_id, salary, department_id, commission_pct
> 2 from employees
> 3 where salary > 10000
> 4 and ( ('&&v_teste' = 'A' and commission_pct is null)
> 5 OR ('&&v_teste' = 'C' and commission_pct is NOT null)
> 6* )
> sys...@xe:SQL>/
> Informe o valor para v_teste: C
>
> EMPLOYEE_ID SALARY DEPARTMENT_ID COMMISSION_PCT
> ----------- ---------- ------------- --------------
> 145 14000 80 ,4
> 146 13500 80 ,3
> 147 12000 80 ,3
> 148 11000 80 ,3
> 149 10500 80 ,2
> 162 10500 80 ,25
> 168 11500 80 ,25
> 174 11000 80 ,3
>
> 8 linhas selecionadas.
>
> blz ??? Simples de tudo... caso vc tenha se perdido com criação/limpeza de
> variáveis lexical/de substituição, com o &, com a exigência de 's na
> comparação de strings, isso é sintaxe sqlplus , o manual "SQLPLUS Reference"
> vai ser a referência pra vc...
>
> []s
>
> Chiappa
>
> --- Em oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br>,
> José Laurindo <jlchia...@...> escreveu
>
> >
> > Então tá , o seu pseudobloco PL/SQL não estava logicamente NEM PERTO de
> se fazer isso, como eu disse vc tava fazendo Atribuição nele, tava meio
> nonsense... Quer dizer então que a var vai estar sempre preenchida , com A
> ou com C, e é a condição de filtro que vc quer variar, certo ? A solução é
> então ultra-simples, vc pode fazer :
> >
> > WHERE ...
> > AND ( (&variavel = 'A' and OBR.DATA_CONCLUIDO is null)
> > or (&variavel = 'C' and OBR.DATA_CONCLUIDO is not null)
> > )
> > ...
> >
> > pronto, no fuss, no muss, tá fazendo o que vc pede...
> >
> > []s
> >
> > Chiappa
> >
> > OBS : notar apenas, como outros colegas já alertaram, que o & (variavel
> lexical/defined) é um sqlpluszismo (usado também pelo SQL Developer e pelo
> Reports), mas de fato NÃO É sintaxe oficial SQL, isso só funciona SE vc for
> executar o SQL num ambiente que aceite essa extensão, BIND VARIABLES, com :
> é que são o Padrão...
> >
> > --- Em oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br>,
> Igor Alves <igor.alvez@> escreveu
> > >
> > > O que quero é o seguinte:
> > > ull
> > > Se o usuario digitar A:
> > > no where deve ir:
> > > OBR.DATA_CONCLUIDO is null
> > >
> > > Caso digite C no where deve ir:
> > > OBR.DATA_CONCLUIDO is not null
> > >
> > >
> > >
> > > Em 23/12/09, José Laurindo <jlchiappa@> escreveu:
> > > >
> > > >
> > > >
> > > > Há duas falhas aí :
> > > >
> > > > a) dentro dum comando SQL (como é o SELECT), vc só pode usar
> instruções
> > > > SQL, o IF é uma Comando PL/SQL, só pode portanto ser usado num Bloco
> Pl/SQL,
> > > > com BEGIN...END - vc até pode chamar Rotinas PL/SQL de dentro dum
> SQL, mas
> > > > via Functions...
> > > > O equivalente do IF num código SQL é a CASE, o a usar
> > > > nhttp://www.tek-tips.com/viewthread.cfm?qid=1235101&page=1 tem um
> > > > exemplinho sobre como usar ele num WHERE. Porém, o CASE só existe nos
> > > > releases mais recentes do bd Oracle (9ir2 ao menos iirc), já que vc
> Pra
> > > > Variar não nos diz qual é o release em uso, se vc não puder vc pode
> usar o
> > > > DECODE : ele é BEM mais limitado, não tem ELSE explícito, não permite
> > > > condição complexa, mas funciona... Consulte o manual de Concepts e o
> de SQL
> > > > pra mais refs.
> > > >
> > > > b) AINDA que fosse possível, a sua sintaxe de IF ... END IF me parece
> > > > BALEADA , pois vc pede :
> > > >
> > > > IF (&STATUS) IS NULL THEN
> > > > obr.DATA_CONCLUIDO is null
> > > > ELSE
> > > > OBR.DATA_CONCLUIDO = ''
> > > > END IF;
> > > >
> > > > ORA, o segundo is null *** não faz sentido ***, pois o IS NULL é uma
> > > > Comparação, pelo que depreendo vc queria, se &STATUS for nulo, **
> ATRIBUIR
> > > > ** null para o tal obr.DATA_CONCLUIDO, correto ? Na sintaxe PL/SQL,
> Como
> > > > Sabemos, a Atribuição é um := , então também a linha após o ELSE, se
> for
> > > > atribuição o desejado, está incorreta, deveria ser := também.... A
> sintaxe
> > > > correta Pl/SQL ficaria assim :
> > > >
> > > > IF (&STATUS) IS NULL THEN
> > > > obr.DATA_CONCLUIDO := null;
> > > > ELSE
> > > > OBR.DATA_CONCLUIDO := '';
> > > > END IF;
> > > >
> > > > ==> o que nos traz ao Terceiro ponto dúbio, pelo jeito
> OBR.DATA_CONCLUIDO é
> > > > uma COLUNA de tabela, Absolutamente Não Faz sentido Atribuir valores
> para
> > > > ela, vc Não Pode Alterar valores num WHERE, nele vc Só Pode Colocar
> > > > Comparações....
> > > >
> > > > Pensando nisso, o que eu entendo é que vc quer é trazer Valores
> Diferentes
> > > > cfrme a variável estiver preenchida ou não, isso vc faz na parte do
> SELECT
> > > > que traz valores , e ** NÃO ** no WHERE, que só compara, penso que
> ficaria
> > > > tipo assim a sua lógica :
> > > >
> > > > SELECT colunas, colunas, ..., CASE &STATUS IS NULL THEN null ELSE ''
> END
> > > > DATA_CONCLUIDO, colunas...
> > > > FROM
> > > > ACOM,
> > > > ATV,
> > > > CONS,
> > > > IMP,
> > > > OBR,
> > > > TP
> > > > WHERE
> > > > ACOM.OBRA_ID = OBR.ID <http://obr.id/> <http://obr.id/>
> > > > AND ATV.TIOB_ID = OBR.TIOB_ID
> > > > AND CONS.ID <http://cons.id/> <http://cons.id/> = OBR.CONS_ID
> > > > AND IMP.OBRA_ID = OBR.ID <http://obr.id/> <http://obr.id/>
> > > > AND TP.ID <http://tp.id/> <http://tp.id/> = OBR.TIOB_ID
> > > > AND OBR.EMPR_CODIGO = 1
> > > > ...
> > > >
> > > > OU SEJA, o valor da coluna selecionada DATA_CONCLUIDO não seria o que
> está
> > > > cadastrado, mas sim varia cfrme a variável estar preenchida ou não...
> Claro,
> > > > nem imagino a diferença para a sua lógica entre atribuir null ou
> atribuir ''
> > > > se a var estiver ou não preenchida , mas a sintaxe seria esta, SE a
> minha
> > > > suposição estiver correta...
> > > >
> > > > []s
> > > >
> > > > Chiappa
> > > >
> > > > --- Em oracle_br@yahoogrupos.com.br 
> > > > <oracle_br%40yahoogrupos.com.br><oracle_br%
> 40yahoogrupos.com.br>, Igor
> > > > Alves <igor.alvez@> escreveu
> > > >
> > > > >
> > > > > Tenho a consulta abaixo, e quero que o usuário digite um valor(está
> no IF
> > > > > dentro do where) caso o valor digitado seja nulo busca os dados que
> a
> > > > > data_conclusao seja nula , caso contrario busca os dados com a data
> de
> > > > > conclusão digitada, Onde está o erro no IF que fiz?
> > > > >
> > > > > SELECT
> > > > > *
> > > > >
> > > > > FROM
> > > > > ACOM,
> > > > > ATV,
> > > > > CONS,
> > > > > IMP,
> > > > > OBR,
> > > > > TP
> > > > >
> > > > > WHERE
> > > > > ACOM.OBRA_ID = OBR.ID <http://obr.id/> <http://obr.id/>
> > > > > AND ATV.TIOB_ID = OBR.TIOB_ID
> > > > > AND CONS.ID <http://cons.id/> <http://cons.id/> = OBR.CONS_ID
> > > > > AND IMP.OBRA_ID = OBR.ID <http://obr.id/> <http://obr.id/>
> > > > > AND TP.ID <http://tp.id/> <http://tp.id/> = OBR.TIOB_ID
> > > > > AND OBR.EMPR_CODIGO = 1
> > > > > AND IF (&STATUS) IS NULL THEN
> > > > > obr.DATA_CONCLUIDO is null
> > > > > ELSE
> > > > > OBR.DATA_CONCLUIDO = ''
> > > > > END IF;
> > > > >
> > > > >
> > > > > --
> > > > > Igor Alves
> > > > > Bacharel em Ciência da Computação
> > > > > Tel: 2202-5658 / 8812-8670
> > > > >
> > > > >
> > > > > [As partes desta mensagem que não continham texto foram removidas]
> > > > >
> > > >
> > > >
> > > >
> > >
> > >
> > >
> > > --
> > > Igor Alves
> > > Bacharel em Ciência da Computação
> > > Tel: 2202-5658 / 8812-8670
> > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> >
>
>  
>



-- 
Igor Alves
Bacharel em Ciência da Computação
Tel: 2202-5658 / 8812-8670


[As partes desta mensagem que não continham texto foram removidas]



------------------------------------

--------------------------------------------------------------------------------------------------------------------------
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--------------------------------------------------------------------------------------------------------------------------
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  
------------------------------------------------------------------------------------------------------------------------
 Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
    oracle_br-unsubscr...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html


Reply via email to