Chippa..

Mais uma vez muito obrigado..

Funcionou perfeitamente.

Atenciosamente.

Leonardo Silva.

Em 26 de abril de 2012 19:08, J. Laurindo Chiappa
<jlchia...@yahoo.com.br>escreveu:

> **
>
>
> Colega, o que acontece é que a substituição de valores no sqlplus é
> LITERAL : o sqlplus substitui mesmo no texto a ser enviado para o banco
> EXATAMENTE o que vc informou : o sql*plus é um programa-cliente, ele é
> INCAPAZ de analisar textos de SQL, necessariamente NADA é executado nele,
> ele apenas ENVIA o texto para o database, que é quem o pode interpretar ...
> Assim, se vc tiver no script, digamos, uma condição de WHERE assim :
>
> WHERE ...
> AND sal >= NVL(&3, sal)
>
> o texto que vai ser enviado para o banco é :
>
> WHERE ...
> and sal >= nvl( , sal)
>
> o que vai acontecer é que :
>
> a) o NVL *** NÃO *** vai ser executado, já que o sqlplus é incapaz disso
>
> b) a variável 3 tem um valor de vazio, vazio é o que será substituído na
> string de texto SQL a ser enviado para o database para posterior
> interpretação... É ** LITERAL ** mesmo, pense na variável lexical como algo
> que vai ser Substituído no texto do SQL pelo sqlplus ....
>
> Há vários work-arounds possíveis , tais como (por exemplo) mandar um SQL
> para o database que via comando COLUMN .... NEW_VALUE substitua o NULL por
> algo apripriado (cfrme
> http://www.freelists.org/post/oracle-l/sqlplus-substitution-variables,9mostra),
>  mas eu prefiro outra técnica : ter aspas-simples (plics) em volta
> das variáveis, de modo que os valores todos sejam tratados como string...
> Dessa forma, no meu exemplo anterior , o texto que iria para o database se
> a variável 3 fosse nula seria :
>
> WHERE ...
> and sal >= nvl('' , sal)
>
> o que aí Sim funciona, strings vazias do tipo são de-nulificadas com NVL...
>
> Uma demonstração :
>
> set term off feedback off verify off pages 0 lines 500 trimspool on head
> off
> spool result.txt
> select deptno, empno, ename, job, sal from emp
> where deptno = nvl(to_number('&1') , deptno)
> and job = nvl('&2', job)
> and sal >= nvl(to_number('&3') , sal)
> ;
> spool off
> exit
> /
>
> ===> Execuções (como eu estou testando no Windows, uso "" para indicar
> string vazia em prompt de comando) :
>
> => primeiro caso, não passando nenhum valor :
>
> C:\Users\jchiappa>sqlplus -s scott/tiger @test_spool.sql "" "" ""
>
> C:\Users\jchiappa>type result.txt
> 20 7369 SMITH CLERK 800
> 30 7499 ALLEN SALESMAN 1600
> 30 7521 WARD SALESMAN 1250
> 20 7566 JONES MANAGER 2975
> 30 7654 MARTIN SALESMAN 1250
> 30 7698 BLAKE MANAGER 2850
> 10 7782 CLARK MANAGER 2450
> 20 7788 SCOTT ANALYST 3000
> 10 7839 KING PRESIDENT 5000
> 30 7844 TURNER SALESMAN 1500
> 20 7876 ADAMS CLERK 1100
> 30 7900 JAMES CLERK 950
> 20 7902 FORD ANALYST 3000
> 10 7934 MILLER CLERK 1300
>
> C:\Users\jchiappa>
>
> => segundo, passando um valor para param1 :
>
> C:\Users\jchiappa>sqlplus -s scott/tiger @test_spool.sql "10" "" ""
>
> C:\Users\jchiappa>type result.txt
> 10 7782 CLARK MANAGER 2450
> 10 7839 KING PRESIDENT 5000
> 10 7934 MILLER CLERK 1300
>
> => passando valores para params 1 e 2 apenas :
>
> C:\Users\jchiappa>sqlplus -s scott/tiger @test_spool.sql "10" "PRESIDENT"
> ""
>
> C:\Users\jchiappa>type result.txt
> 10 7839 KING PRESIDENT 5000
>
> => valorando params 1,2 e 3 :
>
> C:\Users\jchiappa>sqlplus -s scott/tiger @test_spool.sql "10" "PRESIDENT"
> "1000"
>
> C:\Users\jchiappa>type result.txt
> 10 7839 KING PRESIDENT 5000
>
> => apenas params 2 e 3 , veja que a linha com JOB=CLERK com salario menor
> que 1000 não veio :
>
> C:\Users\jchiappa>sqlplus -s scott/tiger @test_spool.sql "" "CLERK" "1000"
>
> C:\Users\jchiappa>type result.txt
> 20 7876 ADAMS CLERK 1100
> 10 7934 MILLER CLERK 1300
>
> => valorando apenas param3, veja que os NVLs enviados para o banco
> funcionaram :
>
> C:\Users\jchiappa>sqlplus -s scott/tiger @test_spool.sql "" "" "1000"
>
> C:\Users\jchiappa>type result.txt
> 30 7499 ALLEN SALESMAN 1600
> 30 7521 WARD SALESMAN 1250
> 20 7566 JONES MANAGER 2975
> 30 7654 MARTIN SALESMAN 1250
> 30 7698 BLAKE MANAGER 2850
> 10 7782 CLARK MANAGER 2450
> 20 7788 SCOTT ANALYST 3000
> 10 7839 KING PRESIDENT 5000
> 30 7844 TURNER SALESMAN 1500
> 20 7876 ADAMS CLERK 1100
> 20 7902 FORD ANALYST 3000
> 10 7934 MILLER CLERK 1300
>
> ===> a prova final, os SQLs que o sqlplus mandou para o banco :
>
> SYSTEM@O10GR2::SQL>select sql_text from v$sql where sql_text like 'select
> deptno, empno, ename, job, sal from emp%' order by last_active_time;
>
> SQL_TEXT
> ----------------------------------------------------------
>
> select deptno, empno, ename, job, sal from emp where deptno =
> nvl(to_number('') , deptno) and job = nvl('', job) and sal >=
> nvl(to_number('') , sal)
> select deptno, empno, ename, job, sal from emp where deptno =
> nvl(to_number('10') , deptno) and job = nvl('', job) and sal >=
> nvl(to_number('') , sal)
> select deptno, empno, ename, job, sal from emp where deptno =
> nvl(to_number('10') , deptno) and job = nvl('PRESIDENT', job) and sal >=
> nvl(to_number('') , sal)
> select deptno, empno, ename, job, sal from emp where deptno =
> nvl(to_number('10') , deptno) and job = nvl('PRESIDENT', job) and sal >=
> nvl(to_number('1000') , sal)
> select deptno, empno, ename, job, sal from emp where deptno =
> nvl(to_number('') , deptno) and job = nvl('CLERK', job) and sal >=
> nvl(to_number('1000') , sal)
> select deptno, empno, ename, job, sal from emp where deptno =
> nvl(to_number('') , deptno) and job = nvl('', job) and sal >=
> nvl(to_number('1000') , sal)
>
> => EVIDENTEMENTE, isto é só um exemplo simples : fosse um script
> completo/profissional, a ser executado num ambiente aonde vc Não Tem
> certeza dos settings correntes, entre outras coisas (como sempre quando se
> trabalha com Conversão), além de NUNCA confiar na ordem de conversão,
> indicando o que deve ser convertido com TO_NUMBER/TO_CHAR/TO_DATE (o que eu
> fiz) , seria de bom tom se ter ESPECIFICADO a ** máscara ** a ser usada, no
> caso de NUMBER ter indicado quais caracteres de Group e Decimal sign se
> deseja, mas isso, creio, é Óbvio...
>
> []s
>
> Chiappa
>
>
> --- Em oracle_br@yahoogrupos.com.br, Leonardo Silva <leonardo.drums@...>
> escreveu
> >
> > Boa tarde pessoal,
> >
> > Novamente nessito da ajuda de vocês, eu inseri a seguinte query dentro de
> > um spool:
> >
> > SELECT A.CNREC CNREC
> > ,A.ART_NO ART_NO
> > ,A.SUPPL_NO SUPPL_NO
> > ,A.QTD_ART QTD_ART
> > ,A.DT_SHELF_LIFE DT_SHELF_LIFE
> > ,A.NMUSR NMUSR
> > FROM SHELF_LIFE_HIST A
> > WHERE A.CNREC = NVL('&3' ,A.CNREC)
> > AND A.ART_NO = NVL('&4' ,A.ART_NO)
> > AND A.SUPPL_NO = NVL('&5' ,A.SUPPL_NO)
> > AND A.QTD_ART = NVL('&6' ,A.QTD_ART)
> > AND A.DT_SHELF_LIFE = NVL('&7' ,A.DT_SHELF_LIFE)
> > AND A.NMUSR = NVL('&8' ,A.NMUSR);
> > porém eu não consigo executar o spool se eu mandar os parametros em
> branco,
> > alguém poderia me dar alguma dica de como fazer funcionar mesmo que eu
> > mande os parametros em branco?
> >
> > Versão do banco: 10.1.0.3.0
> >
> > Desde já agradeço pela atenção.
> > --
> > Atenciosamente
> >
> > Leonardo Silva
> >
> >
> > E da mesma maneira também o Espírito ajuda as nossas fraquezas; porque
> não
> > sabemos o que havemos de pedir como convém, mas o mesmo Espírito
> intercede
> > por nós com gemidos inexprimíveis.Romanos 8:26
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>
>  
>



-- 
Atenciosamente

Leonardo Silva


E da mesma maneira também o Espírito ajuda as nossas fraquezas; porque não
sabemos o que havemos de pedir como convém, mas o mesmo Espírito intercede
por nós com gemidos inexprimíveis.Romanos 8:26


[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


Responder a