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
相关产品推荐
相关产品推荐

