Dlaczego ExecFunc z FireDAC (postgresql) zawsze zawraca null

0

Witajcie

Mam pewnie banalny błąd ale niestety na wujek nie pomógł. Mam bazę na postgresql. W niej funkcję, która wygląda mniej więcej tak:

CREATE OR REPLACE FUNCTION public.add(
  aidsender integer
)
RETURNS integer AS
$body$
DECLARE
  lResult integer;
BEGIN
  lResult := 0;
  if aidsender > 0 then 
    insert into public.taba(requestdate, idsender)
    values (now(), aidsender) returning idrequest into lresult;  --idrequest to pk tabeli taba
    --  
  end if;
--
  return lresult;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

Prościzna. Jak odpalam funkcję to dane się uzupełniają i w programie EMS dla postgresq zwraca mi kolejne wartości z sekwencji. Wszystko super. Teraz robię interfejs usera w delphi. Do teraz używałem zeoslib i chodziło bez problemu ale zmuszony jestem użyć firedac.

Robię więc

with <TADconnection>.Params do
begin
            Params.Clear;
            Params.Add('DriverID=PG');
            Params.Add('CharacterSet=utf8');
            Params.Add('Server='+FSetting.ServerName);
            Params.Add('Port='+FSetting.Port);
            Params.Add('Database='+FSetting.DatabaseName);
            Params.Add('User_Name='+FSetting.Login);
            Params.Add('password='+FSetting.Password);
            Params.Add('ExtendedMetadata=True');

            Connected := True;
end;

i następnie

 
function Add(const pSender: Integer): Integer;
begin
    with spAdd do --to jest TADStoredProc
    begin
        Prepare;
        ParambyName('aidsender').AsInteger := pSender;
        Result := ExecFunc;
    end;
end;

i zawsze zawraca null. Co ciekawe na bazie się rekordy pojawiają więc to nie jest problem funkcji postgresql tylko tych zakichanych firedac. Próbowałem też przez ExecProc i ParamByName('result').AsInteger ale efekt był ten sam ...

Co trzeba jeszcze pyknąć w tych komponentach aby zwracały dane?

1

Lewacko bo lewacko ale problem obszedłem w następujący sposób:

 function Add(const pSender: Integer): Integer;
begin
    with spAdd do --to jest TADStoredProc
    begin
        Prepare;
        ParambyName('aidsender').AsInteger := pSender;
        ExecProc;
        Result := <TADConnection>.GetLastAutoGenValue('<nazwa sekwencji>');
    end;
end;

PS. Jak użyłem zeoslib to oczywiście return działa. Pytanie dlaczego te firedac stawiają taki opór

1 użytkowników online, w tym zalogowanych: 0, gości: 1