简单的伪代码示例:
create function myfunc (someparam text, desired_return_column_name text)
returns table (somekeyname int, MAGIC_DYNAMIC_NAME text)
language SQL
as $funcdef$
select
somekeyname,
fieldofinterest as <MAGIC HERE?> desired_return_column_name
from the_base_table
where some_other_field = someparam
$funcdef$;
在英语中,如何使 Postgres (9.6) 中的 SQL 函数返回一个具有静态定义类型的表,但其中一个返回的列名是根据传入的参数命名的?
如果 SQL 函数无法做到这一点,那么 PL/pgSQL 函数是否可以?
不,这在函数中是不可能的,与它们的语言无关。函数结果集的结构始终是静态的,就像任何给定查询的结果集一样。事实上它是相关的,因为这个结构(列名和类型)必须合并到调用函数的 SQL 查询中。
请记住,客户端应用程序必须能够在执行之前准备查询并获得其结果的描述。此外,准备好的查询可以使用不同的参数重复执行,并且不能在执行过程中返回不同的结构。如果一个函数可以独立且动态地决定它想要返回什么结构,那么就不可能保证该属性。
我不确定文档是否在某处明确指出了这一点(当然它倾向于描述可以做的事情,而不是不可能做的事情)但是协议流文档中的一些位支持这个答案:
在未来的版本(PostgreSQL 11 或更高版本)中,我们可能有存储过程,它们不是通过 SQL 查询调用,而是通过
CALL
不绑定到特定结果集结构的特殊语句调用。事实上,存储过程应该能够返回多个具有不同结构的结果集,而无需事先声明返回类型。这目前正在 -hackers 邮件列表中进行处理和讨论(请参阅来自过程的动态结果集和 SQL 过程的相关最近线程)。但是从 PostgreSQL 10 开始,除了使用 JSON 或 XML 之类的封装类型之外,实际上无法获得动态结果集。