[firebase-br] Utilizar variável Varchar em IN

Carlos Andrade krlosgilson em gmail.com
Sex Jan 17 13:25:09 -03 2020


Cantu, obrigado pela ajuda! Eu acabei tendo a idéia de criar uma SP para 
fazer tal conversão, ficou desta forma:

create or alter procedure sp_util_strtoints (
     istr varchar(1000),
     idelimiter varchar(1))
returns (
     oint integer)
as
declare variable vint varchar(20);
begin
   /* Retorna todos os numeros inteiros de ISTR delimitados por 
IDELIMITER */
   istr = trim(:istr); -- Remove espacos
   if (substring(:istr from char_length(:istr) for 1) <> :idelimiter) 
then -- se nao existir o caractere delimitador no final de ISTR
     istr = :istr||:idelimiter; -- Acrescenta o caractere delimitador em 
ISTR

   while (:istr <> '') do
   begin
     vint = substring(:istr from 1 for position(:idelimiter, :istr)-1);
     istr = trim(substring(:istr from char_length(:vint)+2 for 
char_length(:istr)));
     oint = :vint;
     suspend;
   end
end

E na cláusula where da minha SP em questão, ficou assim:
where ( (:itiposmov = '') or (M.TIPOMOV in ((select OINT from 
SP_UTIL_STRTOINTS(:itiposmov, ',')))) )

> Da forma que vc está fazendo não é possível.
>
> Mas vc pode usar o "for execute statement" montando o comando em
> runtime. Dependendo você pode tb tentar substituir o "in" por
> containing (mas não vai usar índice).
>
> []s
> Carlos H. Cantu
> eBook Guia de Migração para o FB 3 -www.firebase.com.br/guiafb3.php
> www.FireBase.com.br -www.firebirdnews.org - blog.firebase.com.br
>
> CA> Olá! Seria possível utilizar uma variável do tipo varchar com "IN"
> CA> dentro de uma cláusula "where"?
>
> CA> Por ex:
>
> CA> create or alter procedure SP_CONTAS_MOV (
> CA> itiposmov varchar (50)
> CA> ) returns (
> CA> oid integer,
> CA> odescricao varchar(50))
> CA> as
> CA> begin
> CA>   for
> CA>     select M.ID, M.DESCRICAO
> CA>     from CONTAS_MOV M
> CA>     where ( (:itiposmov = '') or (M.TIPOMOV in (:itiposmov)) ) -- Aqui
> CA> como ficaria?
> CA>     into :oid, odescricao
> CA>     do suspend;
> CA> end
>
> CA> o campo "M.TIPOMOV" é do tipo Integer. Desta forma está dando erro de
> CA> conversão de string.




Mais detalhes sobre a lista de discussão lista