PeuNunes 0 Denunciar post Postado Junho 2, 2008 Boa tarde! Seguinte, tenho dois valoes, 558.14 e 1301.12. Quando passo cada um deles, separadamente numa SP, eles retornam valores (resultados). Mas quando tento colocá-los em um "IN" não funciona. Como posso passar esses parâmetros juntos? Obs.: Apesar de serem números, no banco de dados eles estão como VARCHAR. Simplificando, quando passo IN('558.14') ou IN('1301.12') funciona, mas se tento colocá-los juntos, IN('558.14','1301.12'), não funciona. O que tenho que fazer? Valeu! Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Junho 2, 2008 você diz que está fazendo assim select * from tabela where campo in ('558.14') e select * from tabela where campo in ('1301.12') funciona select * from tabela where campo in ('558.14','1301.12') não funciona?? é isso mesmo?? o campo é varchar2? qual o erro que está dando? ou a consulta volta vazia?? para concatenar faz assim '||558.14||','||1301.12||' Compartilhar este post Link para o post Compartilhar em outros sites
PeuNunes 0 Denunciar post Postado Junho 2, 2008 >>você diz que está fazendo assim >>select * from tabela >>where campo in ('558.14') e >>select * from tabela >>where campo in ('1301.12') >>funciona >>select * from tabela >>where campo in ('558.14','1301.12') >>não funciona?? é isso mesmo?? Olá! É isso mesmo! Você entendeu perfeitamente. Não funciona. Não dá erro. >> o campo é varchar2? Sim! Está dessa forma! >>qual o erro que está dando? ou a consulta volta vazia?? Volta vazia! >>para concatenar faz assim >>'||558.14||','||1301.12||' Dessa forma deu o seguinte erro: (1): PLS-00103: Encountered the symbol "," when expecting one of the following: Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Junho 2, 2008 para não ficar parado, pode fazer, mas é gambiarra select * from tabela where campo in ('558.14') or campo in ('1301.12')mas posta a tua sp aí que vamos dar uma olhada. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Junho 3, 2008 Eu uso este esquema que vi no asktom. Cria-se dois typres um para string e um para number. Uma function retorna estes tipos , a query usa estes tipo e função. Permite se passar uma lista IN como parametro. CREATE OR REPLACE TYPE TIPOLISTAINSTR as table of varchar2(30) / CREATE OR REPLACE TYPE TIPOLISTAINNUM as table of number / CREATE OR REPLACE FUNCTION LISTAINSTR ( p_string in varchar2 ) return TipoListaInStr -- -- Retorna uma string para ser usada em uma instrução -- IN de uma condição Where -- -- Use para listas do tipo string -- -- fonte http://asktom.oracle.com -- as l_data TipoListaInStr := TipoListaInStr(); l_string long default p_string || ','; l_n number; begin loop exit when l_string is null; l_data.extend; l_n := instr( l_string, ',' ); l_data( l_data.count ) := substr( l_string, 1, l_n-1 ); l_string := substr( l_string, l_n+1 ); end loop; return l_data; end; / GRANT EXECUTE ON LISTAINSTR TO PUBLIC; CREATE OR REPLACE FUNCTION LISTAINNUM ( p_string in varchar2 ) return TipoListaInNum -- -- Retorna uma string para ser usada em uma instrução -- IN de uma condição Where -- -- Use para listas do tipo numérico -- -- fonte http://asktom.oracle.com -- as l_data TipoListaInNum := TipoListaInNum(); l_string long default p_string || ','; l_n number; begin loop exit when l_string is null; l_data.extend; l_n := instr( l_string, ',' ); l_data( l_data.count ) := substr( l_string, 1, l_n-1 ); l_string := substr( l_string, l_n+1 ); end loop; return l_data; end; / GRANT EXECUTE ON LISTAINNUM TO PUBLIC; -- exemplo SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE IN (Select * from the (Select Cast(listainstr ('VIEW,FUNCTION') As tipolistainstr) From dual)) Compartilhar este post Link para o post Compartilhar em outros sites
PeuNunes 0 Denunciar post Postado Junho 3, 2008 Motta, muito obrigado pela ajuda. O problema que sou novato em PL/SQL e... não entendi nada do que você postou. Desculpe, estupidez minha. Vou tentar ser mais claro. Na página ASP, quando passo o valor 1301.12, e na SP passo o parâmetro: "RL_WHOART.co_whoart in(pST_WHOART)" a consulta retorna um valor. Se a página ASP passar mais de um valor (1301.12,558.14) não retorna nada. Já me disseram que é por causa da vírgula e me passaram a seguinte solução: IF pST_WHOART IS NOT NULL THEN vST_WHOART := REPLACE(pST_WHOART, ',', CHR(39)||','||CHR(39)); END IF; E aí substiruir o parâmetro pST_WHOART pela string vST_WHOART. Não funcionou. Continua funcionando com um parâmetro apenas, mas não com os dois. Agora o mais doido de tudo! Se passar direto na SP assim: "RL_WHOART.co_whoart in('1301.12','558.14')" a consulta retorna um valor. Já tentei de tudo quanto é jeito. Passando os valores já com as aspas, sem as aspas, substituindo aspas por @ e depois tentando substituir esse valor por "'" e não funciona!!! Será que é tão difícil assim arrumar isso? Valeu pela atenção e me ajudem!! Obs.: A SP é muito grande para postar aqui. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Junho 4, 2008 Não sei ASP mas já tentou criar uma variável e atricuir o conteúdo v_xxx := '1301.12','558.14' e passar esta variável no comando ? A solução que postei é para Oracle puro , permite se passar uma lista IN como parametro , aqui funcionou apesar de tornar as queries um pouco mais lentas. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Junho 4, 2008 Não sei ASP mas já tentou criar uma variável e atricuir o conteúdo v_xxx := '1301.12','558.14' e passar esta variável no comando ? A solução que postei é para Oracle puro , permite se passar uma lista IN como parametro , aqui funcionou apesar de tornar as queries um pouco mais lentas. Compartilhar este post Link para o post Compartilhar em outros sites
PeuNunes 0 Denunciar post Postado Junho 5, 2008 Funcionou da seguinte forma: Cria string: vST_WHOART vQUERY_SELECT Verifica se parâmetro não está vazio: IF pST_WHOART IS NOT NULL THEN vST_WHOART := CHR(39)|| REPLACE(pST_WHOART, ',', CHR(39)||','||CHR(39)) || CHR(39); END IF; Acrescenta o script na variável: vQUERY_SELECT := ' SELECT BLÁ, BLÁ BLÁ etc... '; IF pST_WHOART IS NOT NULL THEN vQUERY_WHERE := vQUERY_WHERE || ' AND RL_WHOART.co_whoart IN('||vST_WHOART||')'; END IF; vQUERY_SELECT := vQUERY_SELECT || ' ORDER BY NOTF.CO_NOTIFICACAO'; OPEN REGS FOR vQUERY_SELECT; Só concatendo todo o SELECT (script) que funciona. MAS FUNCIONA!!! :) Valeu pela atenção Motta!! Grande abraço! Compartilhar este post Link para o post Compartilhar em outros sites