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

标签 postgresql types plpgsql

正如我们所知,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/

相关文章:

python - 使用 UPDATE、SET 命令对 PostgreSQL 所做的更改似乎不会持续存在

PHP 准备的 postgres 查询失败,返回 :"could not determine data type of parameter $1"

.net - 如何在运行时向类型解析添加额外的逻辑?

用于 UNION 大量表的 SQL 脚本

sql - PostgreSQL 函数数字类型错误

sql - SQL JOIN 中的 AND/OR 语句

java - 类型参数 E 隐藏了类型 E。尝试了不同的变体,但仍然无法修复

postgresql - 在 postgreSQL pgadmin3 中使用 IF Exists 函数(语法错误,SQL 状态 : 42601 Character: 1)

sql - Postgresql - 将字符串与空值进行比较

postgresql - 如何保存和恢复 ON_ERROR_STOP 的值?