我正在使用 Postgraphile,它可以让您创建以行集作为参数的函数。例如,我有一个将system_versions
行集作为参数的函数:
CREATE OR REPLACE FUNCTION public.system_versions_edition_versions(
system_version system_versions,
system_title character varying DEFAULT NULL::character varying
)
RETURNS SETOF edition_versions
LANGUAGE sql
STABLE STRICT SECURITY DEFINER
AS $function$
SELECT ev.*
FROM public.edition_versions ev
INNER JOIN public.editions e ON ev.edition_id = e.id
INNER JOIN public.systems s ON e.system_id = s.id
INNER JOIN public.system_versions sv ON s.id = sv.system_id
WHERE sv.id = system_version.id
AND (
system_title IS NULL
OR
sv.title = system_title
)
;
$function$
;
通常这些函数是由 Postgraphile 调用的,但我需要手动调用这个函数进行测试......而且我不知道如何提供参数。
当我尝试时:
SELECT public.system_versions_edition_versions(public.system_versions);
我得到:
ERROR: missing FROM-clause entry for table "public"
LINE 1: select public.system_versions_edition_versions(public.system...
但是当我尝试选择表时......
SELECT public.system_versions_edition_versions(SELECT * FROM public.
system_versions);
我得到:
ERROR: syntax error at or near "select"
LINE 1: select public.system_versions_edition_versions(select * from...
当我有一个带有“行集”参数的函数时,任何人都可以解释我如何提供该参数吗?
看起来
system_version
参数类型是行而不是行集。否则sv.id = system_version.id
会导致错误。既然public.system_versions
是表,那么system_versions
就是它的行类型,就像system_versions%rowtype
在 PL/pgSQL 中一样。您可以使用标量子查询来调用它,如下所示:
或者
您还可以考虑使用横向连接。