gpt4 book ai didi

postgresql - 如何从 postgresql 函数返回表的不确定数字列?

转载 作者:行者123 更新时间:2023-11-29 13:03:46 25 4
gpt4 key购买 nike

正如我们所知,plpgsql 函数可以返回这样的表:

RETURNS table(int, char(1), ...)

但是当创建函数时列列表不确定时,如何编写此函数。

最佳答案

当函数返回匿名记录时

RETURNS SETOF record

在使用 SELECT * FROM 调用时,您必须提供一个列定义列表。 SQL 需要知道列名和类型才能解释 *。对于已注册的表和类型,这是由系统目录提供的。对于函数,您需要自己声明一种方式或另一种方式。在函数定义或调用中。该电话可能看起来像 @Craig already provided .您可能没有仔细阅读他的回答。

不过,根据您的具体需要,有多种解决方法:

1) 返回一条匿名记录

例子:

CREATE OR REPLACE FUNCTION myfunc_single()  -- return a single anon rec
RETURNS record AS
$func$
DECLARE
rec record;
BEGIN
SELECT into rec 1, 'foo'; -- note missing type for 'foo'
RETURN rec;
END
$func$ LANGUAGE plpgsql;

这是一个非常有限的利基市场。仅适用于定义为以下函数的单个匿名记录:

RETURNS record

不使用 * FROM 调用:

SELECT myfunc_single();

不适用于 SRF(设置返回函数),仅返回整个记录的字符串表示形式(类型 record)。很少有用。
要从单个匿名记录中获取单个列,您需要再次提供列定义列表:

SELECT * FROM myfunc_single() AS (id int, txt unknown); -- note "unknown" type

2) 返回具有超列集的众所周知的行类型

例子:

CREATE  TABLE t (id int, txt text, the_date date);
INSERT INTO t VALUES (3, 'foz', '2014-01-13'), (4, 'baz', '2014-01-14');

CREATE OR REPLACE FUNCTION myfunc_tbl() -- return well known table
RETURNS SETOF t AS
$func$
BEGIN
RETURN QUERY
TABLE t;
-- SELECT * FROM t; -- equivalent
END
$func$ LANGUAGE plpgsql;

该函数返回表的所有 列。这简短而简单,只要您的表不包含大量列或超大列,性能就不会受到影响。

在调用时选择单独的列:

SELECT id, txt FROM myfunc_tbl();
SELECT id, the_date FROM myfunc_tbl();

-> SQLfiddle展示所有。

3) 高级解决方案

这个答案已经够长了。这个密切相关的答案说明了一切:
Refactor a PL/pgSQL function to return the output of various SELECT queries

具体看上一章:各种完整的表类型

关于postgresql - 如何从 postgresql 函数返回表的不确定数字列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21104826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com