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

PostgreSQL多态函数动态指定表类型参数的实现问题

动态调用PostgreSQL多态函数的问题

我尝试调用一个多态函数,希望通过子函数which_table()动态确定表类型参数,但无法将该子函数返回的varchar转换为实际类型。

我正基于Erwin Brandstetter的Stack Overflow回答(包括「各种完整表类型」章节及《SQL注入安全的多态函数调用》的评论)构建解决方案,期望实现类似SELECT * FROM data_of(NULL::pcdmet, 17);的动态调用,即SELECT * FROM data_of( which_table('可解析为NULL::pcdmet类型的参数') , 17 )。其中pcdmet这类表类型可为普通表、临时表或复合类型。

问题1

我尝试采用PREPARE/EXECUTE方案,但遇到报错:

create or replace function fooprep (inint int, inchar varchar) RETURNS varchar
AS $$
begin
RETURN ''||inint||'  '||inchar;
end;
$$ language plpgsql;

dev_db=> create type int_char as (coli int, colv varchar);
CREATE TYPE

dev_db=> prepare fooplan (int_char) as
select * from fooprep($1, $2);
ERROR:  function fooprep(int_char, unknown) does not exist
LINE 2: select * from fooprep($1, $2);

问题2

即便解决问题1,我仍不清楚如何让which_table()返回可用的类型:尝试将其返回类型设为regclass并返回常量NULL::testtable,但无法作为表类型使用;还尝试如下语法,同样报错:

create or replace FUNCTION foofn (bar anyelement DEFAULT EXECUTE fooplan_mod(5))

错误信息:

ERROR:  syntax error at or near "fooplan"
LINE 1: ...ce FUNCTION foofn (bar anyelement DEFAULT EXECUTE fooplan_mod(5)...
                                                             ^

当前使用PostgreSQL 13版本:psql (13.9 (Ubuntu 13.9-1.pgdg20.04+1), server 13.10 (Ubuntu 13.10-1.pgdg20.04+1))


内容的提问来源于stack exchange,提问作者Randall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:24:21