gpt4 book ai didi

postgresql - 如何将递归转换为plpgsql中的函数?

转载 作者:行者123 更新时间:2023-11-29 14:13:55 36 4
gpt4 key购买 nike

我有该工作代码,但我需要将其转换为具有动态属性 tid=1645 的函数,其中数字 1645 将始终更改。

with recursive r as (
select tid, boss from titles where tid=1645
union
select titles.tid, titles.boss from titles join r on titles.tid = r.boss
)
select * from r

现在,我有同样的:

DROP FUNCTION bosses_of_rsd_tids(integer);
CREATE OR REPLACE FUNCTION public.bosses_of_rsd_tids(rsd_tid int)
RETURNS table (c_tid int, c_boss int)
LANGUAGE plpgsql
AS $function$
begin
with recursive r as (
select tid, boss from titles where tid=rsd_tid
union
select titles.tid, titles.boss from titles join r on titles.boss = r.tid
)

select c_tid, c_boss;
end;
$function$
;

因此我需要结果表...我试图return select c_tid, c_boss;但是有错误:error near return

最佳答案

CREATE OR REPLACE FUNCTION public.bosses_of_rsd_tids(rsd_tid int)
RETURNS TABLE (c_tid int, c_boss int) AS
$func$
BEGIN
RETURN QUERY
WITH RECURSIVE r AS (
SELECT tid, boss
FROM titles
WHERE tid = rsd_tid

UNION ALL -- ?!
SELECT t.tid, t.boss
FROM r
JOIN titles t ON t.tid = r.boss -- !
)
TABLE r; -- !
END
$func$ LANGUAGE plpgsql;

您需要 UNION ALL 而不是 UNION 因为尝试折叠攀登层次结构的重复项没有意义。 (重复会引发无限循环。)

TABLE rSELECT * FROM r 的缩写。你的组织。 select c_tid, c_boss 错误。见:

也可以是更简单的SQL函数:

CREATE OR REPLACE FUNCTION public.bosses_of_rsd_tids(rsd_tid int)
RETURNS TABLE (c_tid int, c_boss int) AS
$func$
WITH RECURSIVE r AS (
SELECT tid, boss
FROM titles
WHERE tid = rsd_tid

UNION ALL
SELECT t.tid, t.boss
FROM r
JOIN titles t ON t.tid = r.boss
)
TABLE r;
$func$ LANGUAGE sql;

参见:

关于postgresql - 如何将递归转换为plpgsql中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56024395/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com