如何从postgresql函数返回表中数量不确定的列?
众所周知,plpgsql函数可以返回如下表:如何从postgresql函数返回表中数量不确定的列?,postgresql,types,plpgsql,Postgresql,Types,Plpgsql,众所周知,plpgsql函数可以返回如下表: RETURNS table(int, char(1), ...) 但是,当创建函数时列列表不确定时,如何编写此函数。如果结果的格式不确定/未定义,则必须使用返回记录或(对于多行结果)返回记录集 然后调用函数必须指定表格式,例如: SELECT my_func() AS result(a integer, b char(1)); 顺便说一句,char是一种糟糕的数据类型,它具有疯狂的空格填充规则,可以追溯到固定宽度文件格式的时代。不要用它。始终只使
RETURNS table(int, char(1), ...)
但是,当创建函数时列列表不确定时,如何编写此函数。如果结果的格式不确定/未定义,则必须使用
返回记录
或(对于多行结果)返回记录集
然后调用函数必须指定表格式,例如:
SELECT my_func() AS result(a integer, b char(1));
顺便说一句,char
是一种糟糕的数据类型,它具有疯狂的空格填充规则,可以追溯到固定宽度文件格式的时代。不要用它。始终只使用text
或varchar
在给出评论后,让我们将这一点真正明确:
regress=> CREATE OR REPLACE FUNCTION f_something() RETURNS SETOF record AS $$
SELECT 1, 2, TEXT 'a';
$$ LANGUAGE SQL;
CREATE FUNCTION
regress=> SELECT * FROM f_something();
ERROR: a column definition list is required for functions returning "record"
LINE 1: SELECT * FROM f_something();
regress=> SELECT * FROM f_something() AS x(a integer, b integer, c text);
a | b | c
---+---+---
1 | 2 | a
(1 row)
当函数返回匿名记录时
RETURNS SETOF record
使用SELECT*FROM
调用列定义列表时,必须提供一个列定义列表。SQL要求知道要解释的列名和类型。对于已注册的表和类型,这由系统目录提供。对于函数,您需要以某种方式自己声明它。在函数定义或调用中。电话可能看起来像。你可能没有仔细阅读他的答案
根据您的具体需要,有多种方法可以解决此问题,不过:
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;
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;
这是一个非常有限的利基。仅适用于定义为的函数中的单个匿名记录:
RETURNS record
不带*从呼叫:
SELECT myfunc_single();
不适用于SRF(设置返回函数),只返回整个记录的字符串表示形式(键入record
)。很少有用。
要从单个匿名记录中获取单个COL,需要再次提供列定义列表:
SELECT * FROM myfunc_single() AS (id int, txt unknown); -- note "unknown" type
2) 返回具有超级列集的已知行类型
例如:
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;
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();
展示一切
3) 高级解决方案
这个答案已经足够长了。这一密切相关的答案涵盖了一切:
请特别看最后一章:各种完整的表格类型您好。谢谢你的回复。如果您能给我一个示例代码,我将不胜感激。我曾尝试使用returns record,但错误如下:错误:返回“record”@Moon_of_father的函数需要列定义列表。您阅读了我答案的下半部分了吗?(编辑)使用逐步示例更新。