Fórum Passar paramentros para o comando IN em uma procedure #430503

06/12/2012

0

Nao estou conseguindo passar valores concatenados para o comando NOT IN dentro da procedure, estou fazendo a seguinte concatenacao:

if (locais_not = '') then
locais_not = '''' || :ID_BAIA_OUT || '''';
else
locais_not = locais_not || ',' || '''' || :ID_BAIA_OUT || '''';

e passo essa variavel na select:

select a.ID, a.CODABC
from ARM_LOCAL a
where a.ID not in ( :locais_not )
and substring(a.ID from 1 for 1) = 'C'
and a.Inativo = 'F'
order by a.CODABC desc, A.ID

porem o comando NOT IN nao entende o conteudo, provavelmente por causa dos aspas, mas nao consegui fazer rodar.
Nilton Sacco

Nilton Sacco

Responder

Posts

06/12/2012

Claudia Nogueira

O campo ID é integer e no IN você usa os valores integer separados por vírgula, por exemplo IN (1,2,3,4), não precisa de apóstrofo.

Você não falou a linguagem, mas pelo if e o then parece ser Delphi.
if (locais_not = '') then
locais_not := ':ID_BAIA_OUT'
else
locais_not := locais_not + ',:ID_BAIA_OUT';

Qry.Close;
Qry.SQL.Text := 'select a.ID, a.CODABC ' +
'from ARM_LOCAL a ' +
'where a.ID not in ( '+locais_not+' ) ' +
'and substring(a.ID from 1 for 1) = ''C'' ' +
'and a.Inativo = ''F'' ' +
'order by a.CODABC desc, A.ID';
Qry.ParamByName('ID_BAIA_OUT').AsInteger := aqui_alguma_coisa;
Qry.Open;


Responder

Gostei + 0

06/12/2012

Claudia Nogueira

Mil desculpas, fui totalmente infeliz na minha resposta, pois não li direito, não vi que você queria uma procedure no Firebird.

Como a procedure é selecionável, seria mais ou menos assim:

CREATE OR ALTER PROCEDURE NEW_PROCEDURE (
    id_baia_out varchar(500),
    locais_not varchar(500))
returns (
    codabc integer,
    id varchar(500))
as
begin
FOR
select a.ID, a.CODABC
from ARM_LOCAL a
where a.ID not in ( :locais_not, :ID_BAIA_OUT  )
and substring(a.ID from 1 for 1) = 'C'
and a.Inativo = 'F'
order by a.CODABC desc, A.ID INTO :ID, :codabc
  DO
  suspend;
end


Não vejo sentido em concatenar as duas variáveis, pois no IN vai retornar se pelo menos alguma satisfizer a condição, e como só tem duas variáveis, pode fazer direto no SELECT.
Responder

Gostei + 0

06/12/2012

Claudia Nogueira

Só mais uma coisa, pra chamar ela usaria isso:

SELECT * FROM NEW_PROCEDURE(:TESTE,:TESTE1)
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar