↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 7.3
历史版本PostgreSQL 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

9.7. 表函数 #

表函数是产生一组行的函数,这些行由基本(标量)数据类型或复合(多列)数据类型组成。它们在 FROM 子句中的用法与表、视图或子查询相同。表函数返回的列可以像表、视图或子查询的列一样包含在 SELECT、JOIN 或 WHERE 子句中。

如果表函数返回基本数据类型,单个结果列以函数命名。如果函数返回复合类型,各结果列使用该类型各属性的名称。

表函数可以在 FROM 子句中起别名,也可以不起别名。如果函数在 FROM 子句中使用而没有别名,则函数名被用作关系名。

表函数在 SELECT 语句中凡表可用处皆可用。例如

CREATE TABLE foo (fooid int, foosubid int, fooname text);

CREATE FUNCTION getfoo(int) RETURNS setof foo AS '
    SELECT * FROM foo WHERE fooid = $1;
' LANGUAGE SQL;

SELECT * FROM getfoo(1) AS t1;

SELECT * FROM foo
WHERE foosubid in (select foosubid from getfoo(foo.fooid) z
                   where z.fooid = foo.fooid);

CREATE VIEW vw_getfoo AS SELECT * FROM getfoo(1);
SELECT * FROM vw_getfoo;

都是有效的语句。

某些情况下,定义能根据调用方式返回不同列集的表函数是有用的。为支持这一点,可以把表函数声明为返回伪类型 record。当这样的函数用于查询中时,必须在查询本身中指定所期望的行结构,以便系统知道如何解析和规划该查询。考虑这个例子:

SELECT *
FROM dblink('dbname=template1', 'select proname, prosrc from pg_proc')
  AS t1(proname name, prosrc text)
WHERE proname LIKE 'bytea%';

dblink 函数执行一个远程查询(见 contrib/dblink)。它被声明为返回 record,因为它可能用于任何种类的查询。必须在调用查询中指定实际的列集,以便解析器知道(例如)* 应展开成什么。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。