PostgreSQL:如何向函数传递行集参数?Postgraphile函数测试
给接收行类型参数的PostgreSQL函数传参的正确方式
首先澄清:你的函数public.system_versions_edition_versions的第一个参数是单个system_versions行类型,不是行集(SETOF)。之前的错误尝试都是因为没搞清楚这一点,下面是正确的调用方法:
1. 传递单个行记录
如果要针对system_versions表中的某一行调用函数,有两种方式:
- 从表中直接选取一行(用括号包裹子查询):
-- 示例:传递ID为1的system_versions行 SELECT public.system_versions_edition_versions((SELECT sv FROM public.system_versions sv WHERE sv.id = 1)); -- 带可选参数system_title的调用 SELECT public.system_versions_edition_versions((SELECT sv FROM public.system_versions sv WHERE sv.id = 1), '系统标题');
- 用行构造器手动构造行(需要匹配表的字段顺序):
-- 假设system_versions表的字段是id、title、...,按顺序传入值并转换类型 SELECT public.system_versions_edition_versions(ROW(1, 'v1.0.0')::public.system_versions);
2. 批量遍历所有行调用函数
如果需要对system_versions的每一行都执行这个函数,用LATERAL关联查询:
-- 遍历所有system_versions行,调用函数并返回结果 SELECT ev.* FROM public.system_versions sv, LATERAL public.system_versions_edition_versions(sv) ev; -- 带可选参数的批量调用 SELECT ev.* FROM public.system_versions sv, LATERAL public.system_versions_edition_versions(sv, '指定系统标题') ev;
之前错误的原因
- 第一种尝试
SELECT public.system_versions_edition_versions(public.system_versions);:直接写表名不是合法的行类型参数,PostgreSQL会将其视为表引用,但此处需要的是单个行记录,因此报错“缺少FROM子句条目”。 - 第二种尝试
SELECT public.system_versions_edition_versions(SELECT * FROM public.system_versions);:子查询作为参数必须用括号包裹,而且即使加了括号,如果子查询返回多行,也会因为参数要求单个行而报错。
内容的提问来源于stack exchange,提问作者machineghost
相关产品推荐
相关产品推荐

