demo: db <> fiddle
Вы можете создать свой собственный тип возврата:
CREATE TYPE my_type AS (sum real, max_v real);
Это может использоваться в SFUNC
:
CREATE OR REPLACE FUNCTION calculateSum(my_type, real) RETURNS my_type -- returns my_type
AS $$
DECLARE
sumValue real := 0;
max_v real;
output my_type; -- new variable of my_type
BEGIN
/* A LOT OF CODE HERE */
output.sum := sumValue;
output.max_v := max_v;
RETURN output;
END;
$$ LANGUAGE plpgsql;
И, конечно, в качестве входных данных для вашего FINALFUNC
:
CREATE OR REPLACE FUNCTION addLaplacianNoiseSum(my_type) RETURNS real AS $$
Использование его в FINALFUNC
:
$1.max_v
$1.sum
Тогда ваш агрегат будет выглядеть как
CREATE AGGREGATE SUM_LAPLACE(real) (
SFUNC = calculateSum,
STYPE = my_type, -- return type == my_type
FINALFUNC = addLaplacianNoiseSum
);