[oracle_br] Re: cláusula IN PL-SQL

2006-04-25 Por tôpico jlchiappa



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, 'nnn') onde n é 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/')
 data_ini,
 TO_CHAR(AtivLocal.atlo_dt_fim, 'DD/MM/') 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!.












Re: [oracle_br] Re: cláusula IN PL-SQL

2006-04-25 Por tôpico Itamar Ribeiro



É 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, 'nnn') onde n é 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/')
  data_ini,
  TO_CHAR(AtivLocal.atlo_dt_fim, 'DD/MM/') 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:
  
  
PUBLICIDADE




  
  



  




  
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!.











[oracle_br] Re: cláusula IN PL-SQL

2006-04-25 Por tôpico jlchiappa



Isso não vai funcionar NUNCA em SQL estático (que é o default em se 
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]:SQLselect * 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]:SQLselect * 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]:SQLselect * 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]:SQLselect * 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, 'nnn') onde n é 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/')
   data_ini,
   TO_CHAR(AtivLocal.atlo_dt_fim, 'DD/MM/') 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
 
  

Re: [oracle_br] Re: cláusula IN PL-SQL

2006-04-25 Por tôpico Thiago Lazzarotto



Uma forma de fazer isso, mas NAO recomendada se a coluna que vc está 
comparando
usaria indice para a pesquisa é:

select * from tabela where variavel like '%' || campo_da_tabela || '%;

ou conforme teu exemplo: AND p_DataIni like '%' || to_char 
(AtivLocal.ativ_dt_data_inicio, 'dd/mm/') || '%'

Testa e nos avisa!
Abraços.
Thiago.


jlchiappa escreveu:

 Isso não vai funcionar NUNCA em SQL estático (que é o default em se
 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]:SQLselect * 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]:SQLselect * 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]:SQLselect * 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]:SQLselect * 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, 'nnn') onde n é 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/')
data_ini,
TO_CHAR(AtivLocal.atlo_dt_fim, 'DD/MM/') 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/
   --