Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

PeuNunes

Concatenar valores

Recommended Posts

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

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.