一个非常奇怪的情况,查询返回 1380 个项目,但是当包装在一个函数中时,同一个函数返回一行
我试过删除并重新创建该功能。
当这样调用时,通过一个函数,返回 1 行。
CREATE OR REPLACE FUNCTION get_temps(tid uuid) RETURNS uuid
LANGUAGE sql
AS
$$
WITH RECURSIVE
start_set (temp_id, display_name, parent_temp_id) AS
(SELECT t.temp_id, t.display_name, t.parent_temp_id
FROM temps t
WHERE t.temp_id = tid),
subitems (temp_id, display_name, parent_temp_id) AS
(SELECT s.temp_id, s.display_name, s.parent_temp_id
FROM start_set s
UNION ALL
SELECT t.temp_id, t.display_name, t.parent_temp_id
FROM temps t
JOIN subitems subs ON t.parent_temp_id = subs.temp_id)
SELECT temp_id
FROM subitems;
$$;
当调用 not-in-a-function-wrapper 时,它返回 1380 行
WITH RECURSIVE
start_set (temp_id, display_name, parent_temp_id) AS
(SELECT t.temp_id, t.display_name, t.parent_temp_id
FROM temps t
WHERE t.temp_id = tid),
subitems (temp_id, display_name, parent_temp_id) AS
(SELECT s.temp_id, s.display_name, s.parent_temp_id
FROM start_set s
UNION ALL
SELECT t.temp_id, t.display_name, t.parent_temp_id
FROM temps t
JOIN subitems subs ON t.parent_temp_id = subs.temp_id)
SELECT temp_id
FROM subitems;
我没有想到什么?
要返回一组值(或一组行),它必须是一个返回集合的函数:
现在它可以返回 0-n 行。这包括完全不返回任何内容(“无行”)。你声明它的方式,它是一个“标量”函数,总是返回一个值。手册:
请参阅(带有更多链接):
或者,您可以使用
RETURNS TABLE (...)
.LANGUAGE
任一返回类型都可以与任何(plpgsql
, , ...)一起使用sql
。虽然您不需要 PL/pgSQL(或其他 PL)提供的过程元素,只需要纯 SQL,但通常最好坚持使用普通LANGUAGE sql
函数。关于语言选择:对于您的简单案例,我可能会使用“标准 SQL”函数。看:
我找到了答案,朝着@erwin 的方向前进
关键是:
plpgsql
语言TABLE