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