返回表的无类型函数

swr*_*bel 4 postgresql datatypes plpgsql functions

我想编写一个 PostgreSQL 存储函数,它的行为本质上类似于我从 MSSQL 和 MySQL 中了解和喜爱的存储过程,我可以在其中包装一个不带参数的查询并让它返回该结果集,而无需指定输出的格式并在每次更新查询时更改该定义。这在 PostgreSQL 中甚至可能吗?

我使用 PostgreSQL 9.2 尝试了以下操作:

CREATE OR REPLACE FUNCTION test()
RETURNS SETOF record
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

错误:返回“记录”的函数需要列定义列表

我也试过:

CREATE OR REPLACE FUNCTION test()
RETURNS table ()
Run Code Online (Sandbox Code Playgroud)

但显然这是无效的语法。

Erw*_*ter 5

这是一种误解。像这样的函数是完全有效的:

CREATE OR REPLACE FUNCTION test()
 RETURNS SETOF record AS
$func$
VALUES (1, 2), (3, 4);  -- 2 rows with 2 integer columns
$func$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

但是,由于它返回匿名记录,因此您需要在每次调用时提供一个列定义列表,就像错误消息告诉您的那样。SQL 要求预先知道对函数的期望。呼叫将像这样工作:

SELECT * FROM test() AS f(a int, b int);
Run Code Online (Sandbox Code Playgroud)

返回匿名记录的函数有其用途。我尽量避免使用它们,因为调用相当笨拙。根据您的确切要求,有几种方法可以解决。我最近在 SO 上为此写了一个全面的答案