作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如我们所知,plpgsql 函数可以返回这样的表:
RETURNS table(int, char(1), ...)
但是当创建函数时列列表不确定时,如何编写此函数。
最佳答案
当函数返回匿名记录时
RETURNS SETOF record
在使用 SELECT * FROM
调用时,您必须提供一个列定义列表。 SQL 需要知道列名和类型才能解释 *
。对于已注册的表和类型,这是由系统目录提供的。对于函数,您需要自己声明一种方式或另一种方式。在函数定义或调用中。该电话可能看起来像 @Craig already provided .您可能没有仔细阅读他的回答。
不过,根据您的具体需要,有多种解决方法:
例子:
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
例子:
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展示所有。
这个答案已经够长了。这个密切相关的答案说明了一切:
Refactor a PL/pgSQL function to return the output of various SELECT queries
具体看上一章:各种完整的表类型
关于postgresql - 如何从 postgresql 函数返回表的不确定数字列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21104826/
我是一名优秀的程序员,十分优秀!