На самом деле вам не нужно EXECUTE
для вашего случая, так как нет динамического параметра, такого как имя таблицы, имя столбца и т. Д. Изменяется только значение, переданное предложению where.Счетчик может быть частью select.
CREATE OR REPLACE FUNCTION resources(start_date INTEGER, end_date INTEGER,
step INTEGER)
RETURNS TABLE (
cpu bigint
, ram bigint
, counter int) AS $$
DECLARE
counter INTEGER := 0 ;
BEGIN
counter := start_date;
LOOP
EXIT WHEN counter > end_date ;
RETURN QUERY
SELECT sum(j_ram)::bigint as ram, sum(j_cpu)::bigint as cpu,
counter from jobs
where j_start_time <= counter
and j_end_time >= counter;
counter := counter + step ;
END LOOP ;
END;
$$ LANGUAGE plpgsql;
Я бы порекомендовал вам избегать циклов, достаточно было бы использовать один запрос, использующий generate_series
. Тогда эта функция может быть простой функцией SQL если у вас нет ничего другого, кроме как вернуть только результат запроса.
CREATE OR REPLACE FUNCTION resources2(start_date INTEGER, end_date INTEGER,
step INTEGER)
RETURNS TABLE (
cpu bigint
, ram bigint
, counter int) AS $$
SELECT sum(j_ram) :: BIGINT AS ram,
sum(j_cpu) :: BIGINT AS cpu,
g.counter
FROM jobs j
JOIN (SELECT generate_series(start_date, end_date, step) AS counter) g
ON j_start_time <= g.counter
AND j_end_time >= g.counter
GROUP BY g.counter
ORDER BY g.counter;
$$ LANGUAGE sql;
Демо