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,9 
mostra), 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]
>


Responder a