[oracle_br] Re: cláusula IN PL-SQL
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
É 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
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
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/ --