escrevendo SQl em PL/SQL), o manual "Oracle9i SQL Reference" já nos
avisa que os operadores de listas (como o IN) trabalham com uma LISTA
de valores, e NÂO com um único valor string, exemplo :
[EMAIL PROTECTED]:SQL>select * from dept;
DEPTNO DNAME LOC
------------------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
77 Depto 77 LOC77
78 Ação Pí de Sá
50 Pólen Vitória
43 Depto 43 LOC43
8 linhas selecionadas.
==> vamos pasar VÁRIOS valores :
[EMAIL PROTECTED]:SQL>select * from dept where deptno in (10, 20, 30);
DEPTNO DNAME LOC
------------------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
==> vou passar uma única string :
[EMAIL PROTECTED]:SQL>select * from dept where deptno in ('10, 20, 30');
select * from dept where deptno in ('10, 20, 30')
*
ERRO na linha 1:
ORA-01722: número inválido
Sim ??? Pra vc fazer isto vc precisa de SQL dinâmico, no plus poderia
ser algo tipo :
[EMAIL PROTECTED]:SQL>select * from dept where deptno in (&v_lista_depto);
Informe o valor para v_lista_depto: 10, 20, 30
antigo 1: select * from dept where deptno in (&v_lista_depto)
novo 1: select * from dept where deptno in (10, 20, 30)
DEPTNO DNAME LOC
------------------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
agora sim.... Evidentemente, SQL dinâmico com & é um recurso do
sqlplus apenas, no caso do PL/SQL (que é no que procedures são
escritas), vc faz SQL dinâmico com EXECUTE IMMEDIATE ou DBMS_SQL, ou
ainda vc tem uma OUTRA opção que é ter uma LISTA de valores (array),
em http://asktom.oracle.com/pls/ask/f?
p=4950:8:::::F4950_P8_DISPLAYID:110612348061 vc tem um exemplo.
==> e seja qual método vc usar, repito, NÂO faça conversões
implícitas, compare DATEs com DATEs, ok ??
[]s
Chiappa
--- Em oracle_br@yahoogrupos.com.br, "Itamar Ribeiro" <[EMAIL PROTECTED]>
escreveu
>
> É pq na verdade esse parâmetro que eu passo é um intervalo de datas
no
> formato ('01/01/2005','03/02/2005','01/01/2004'), na query, se eu
> substituo roda sem problema, mas passando como parâmetro na proc é
que
> dá esse erro.
>
>
> Em 25/04/06, jlchiappa<[EMAIL PROTECTED]> escreveu:
> > Itamar, alguma coisa está estranha aí , esse
> > AtivLocal.ativ_dt_data_inicio será que não é DATE ?? Se sim, vc
> > definiu p_DataIni como IN VARCHAR2, necessariamente se vc tentar
> > comparar DATE com VARCHAR vai haver conversão implícita,
dependendo
> > de como estiver o formato default de data no cliente PODE ou não
> > funcionar.... OU vc define p_DataIni como DATE, OU vc faz a
conversão
> > explícita, com AtivLocal.ativ_dt_data_inicio in (TO_DATE
> > (p_DataIni, 'nnnnnnn') onde nnnnn é o formato de data desejado. E
> > outra coisa, porque esse IN se NECESSARIAMENTE um parâmetro sempre
> > contém apenas um valor ???
> >
> > []s
> >
> > Chiappa
> >
> > --- Em oracle_br@yahoogrupos.com.br, "Itamar Ribeiro"
<[EMAIL PROTECTED]>
> > escreveu
> >
> > >
> > > Pessoal, estou com uma dúvida ao fazer uma proc que usa
cláusula IN:
> > >
> > >
> > > CREATE OR REPLACE PACKAGE BODY Pkg_Teste AS
> > > PROCEDURE Proc_Teste(Meu_Cursor IN OUT Tipo_Cursor, p_Matri IN
> > > NUMBER, p_DataIni IN VARCHAR2) IS
> > > BEGIN
> > > OPEN Meu_Cursor FOR
> > > SELECT
> > > AtivLocal.empr_nr_matricula,
> > > AtivLocal.Loca_Cd_Local,TO_CHAR
> > (AtivLocal.atlo_dt_ini, 'DD/MM/YYYY')
> > > data_ini,
> > > TO_CHAR(AtivLocal.atlo_dt_fim, 'DD/MM/YYYY') data_fim
> > > FROM ppp_atividade_local AtivLocal, ppp_local Loca,
> > ppp_instalacao Inst
> > > WHERE AtivLocal.loca_cd_local = Loca.loca_cd_local
> > > AND Loca.inst_cd_instalacao = Inst.inst_cd_instalacao
> > > AND AtivLocal.empr_nr_matricula = p_Matri
> > > AND AtivLocal.ativ_dt_data_inicio in (p_DataIni)
> > > order by AtivLocal.atlo_dt_fim asc;
> > >
> > > Ao rodar essa proc ele retorna o seguinte erro:
> > >
> > > ORA-01858: a non-numeric character was found where a numeric was
> > expected
> > > ORA-06512: at "SPPP.PKG_TESTE", line 4
> > > ORA-06512: at line 11
> > >
> > > Estou esbarrando na cláusula in, como faço para rodar essa
query com
> > > os parâmetros corretos?
> > >
> > > Obrigado.
> > >
> >
> >
> >
> >
> >
> >
> > ------------------------------------------------------------------
--------------------------------------------------------
> > Atenção! As mensagens deste grupo são de acesso público e de
inteira
> > responsabilidade de seus remetentes.
> > Acesse:
> > http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> > ------------------------------------------------------------------
--------------------------------------------------------
__________________________________________________________________
> >
> > Este Grupo recebe o apoio da SQL Magazine -
www.devmedia.com.br/sqlmagazine
> > __________________________________________________________________
> > O grupo Oracle_br não aceita anexos. Quando oferecer algum
arquivo, tenha o
> > link do mesmo para evitar trafego(pedidos) desnecessário.
> >
> >
> > ________________________________
> > 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:
> > [EMAIL PROTECTED]
> >
> > O uso que você faz do Yahoo! Grupos está sujeito aos Termos do
Serviço do
> > Yahoo!.
>
--------------------------------------------------------------------------------------------------------------------------
Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
--------------------------------------------------------------------------------------------------------------------------__________________________________________________________________
Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine
__________________________________________________________________
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o link do mesmo para evitar trafego(pedidos) desnecessário.
Yahoo! Grupos, um serviço oferecido por: | |
|
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:
[EMAIL PROTECTED]
- O uso que você faz do Yahoo! Grupos está sujeito aos Termos do Serviço do Yahoo!.