Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!
>>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:
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.
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; 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))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.
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.
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.
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!
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||'