You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:27:31