Чтобы ваша функция plpgsql работала, вам нужно предложение RETURNS
, совпадающее с тем, что вы возвращаете. И вам нужно на самом деле вернуть что-то. Я полагаю:
CREATE OR REPLACE FUNCTION iceberg_query ( percentage numeric)
<b>RETURNS TABLE (item ?TYPE?, location ?TYPE?, year ?TYPE?, ct bigint)</b>
AS
$func$
DECLARE
numrows bigint := (SELECT count(*) FROM sales);
BEGIN
<b>RETURN QUERY</b>
SELECT s.item, s.location, s.year, count(*)
FROM sales s
GROUP BY cube(s.item,s.location,s.year)
HAVING count(*) >= numrows * percentage / 100;
END
$func$ LANGUAGE plpgsql;
Заменить заполнители ?TYPE?
на фактические (нераскрытые) типы данных.
Вызовите функцию с помощью:
SELECT * FROM iceberg_query (10);
Обратите внимание, как я квалифицирую в таблице все имена столбцов в запросе, чтобы избежать конфликтов имен с новыми параметрами OUT
с тем же именем.
И обратите внимание на использование numeric
вместо integer
, как указано Скотсом в комментарии .
Связанный:
В сторону: вам не нужно функция для этого. Этот простой SQL-запрос делает то же самое:
SELECT s.item, s.location, s.year, count(*)
FROM sales s
GROUP BY cube(s.item,s.location,s.year)
HAVING count(*) >= (SELECT count(*) * $percentage / 100 FROM sales); -- your pct here
Укажите числовой литерал (10.0
, а не 10
), чтобы избежать целочисленного деления и округления, которое идет с ним.