9.7. 表函数

表函数是生成一个行集合的函数,这些行可以是由基本(标量)数据类型, 也可以是由复合(多字段)数据类型组成。它们的使用类似 FROM 中的一个表,视图, 或者是子查询。表函数返回的字段可以象表,视图,或者子查询字段一样的 形式包含在 SELECTJOIN, 或者 WHERE 子句里。

如果表函数返回一个基本数据类型,那么这个单结果字段以函数的名字命名。 如果函数返回一个复合类型,那么结果字段获得和该复合类型的独立字段相同的名字。

一个表函数可以在 FROM 子句里面取别名,单它也可以不用别名。 如果一个函数不用别名在 FROM 子句里使用,那么函数名用作关系名。

表函数可以在 SELECT 语句里面可以使用表的地方用。 比如

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

    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,因为它可能用于任何类型的查询。实际的字段集 必须在调用查询里声明,这样分析器才知道象 * 这样的东西应该展开 成什么。