Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从postgresql函数返回表中数量不确定的列?_Postgresql_Types_Plpgsql - Fatal编程技术网

如何从postgresql函数返回表中数量不确定的列?

如何从postgresql函数返回表中数量不确定的列?,postgresql,types,plpgsql,Postgresql,Types,Plpgsql,众所周知,plpgsql函数可以返回如下表: RETURNS table(int, char(1), ...) 但是,当创建函数时列列表不确定时,如何编写此函数。如果结果的格式不确定/未定义,则必须使用返回记录或(对于多行结果)返回记录集 然后调用函数必须指定表格式,例如: SELECT my_func() AS result(a integer, b char(1)); 顺便说一句,char是一种糟糕的数据类型,它具有疯狂的空格填充规则,可以追溯到固定宽度文件格式的时代。不要用它。始终只使

众所周知,plpgsql函数可以返回如下表:

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的函数需要列定义列表。您阅读了我答案的下半部分了吗?(编辑)使用逐步示例更新。