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?