Passar paramentros para o comando IN em uma procedure
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.
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
Curtidas 0
Respostas
Claudia Nogueira
06/12/2012
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.
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;
GOSTEI 0
Claudia Nogueira
06/12/2012
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:
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.
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.
GOSTEI 0
Claudia Nogueira
06/12/2012
Só mais uma coisa, pra chamar ela usaria isso:
SELECT * FROM NEW_PROCEDURE(:TESTE,:TESTE1)
GOSTEI 0