假设我有一个恋人item,location,year,supplier,unit_sales
,
我想写一个plpgsql
函数
图片中查询周围的包装,以指定参数N
,
像这样:
create or replace function iceberg_query( percentage integer )
returns cube
/* Code here */
as
$$
declare
numrows int;
begin
select count(*) into numrows from sales;
select item, location, year, count(*)
from sales
group by cube(item,location,year)
having count(*) >= numrows*percentage/100;
end;
$$ language 'plpgsql'
要使这项工作有效,我需要在Code here
部分中添加什么?如何在plpgsql
中将数据立方体指定为返回类型?
答案 0 :(得分:1)
要使您的plpgsql函数正常工作,您需要一个RETURNS
子句来匹配返回的子句。您实际上需要返回一些东西。我想:
CREATE OR REPLACE FUNCTION iceberg_query ( percentage numeric)
RETURNS TABLE (item ?TYPE?, location ?TYPE?, year ?TYPE?, ct bigint)
AS
$func$
DECLARE
numrows bigint := (SELECT count(*) FROM sales);
BEGIN
RETURN QUERY
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
代替comment中酷航所指出的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
)以避免整数除法和随之而来的舍入。