已结束支持的版本: 7.3
历史版本。 PostgreSQL 7.3 已结束支持。 请参阅 当前版本手册.
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,因为它可能用于任何种类的查询。必须在调用查询中指定实际的列集,以便解析器知道(例如)*
应展开成什么。