返回TABLESETOF records的函数之间有什么区别,其他条件都相同.

CREATE FUNCTION events_by_type_1(text) RETURNS TABLE(id bigint, name text) AS $$
    SELECT id, name FROM events WHERE type = $1;
$$ LANGUAGE SQL STABLE;

CREATE FUNCTION events_by_type_2(text) RETURNS SETOF record AS $$
    SELECT id, name FROM events WHERE type = $1;
$$ LANGUAGE SQL STABLE;

这些函数似乎返回相同的结果.看这个SQLFiddle.

推荐答案

当返回SETOF record时,输出列不会被键入,也不会被命名.因此,这种形式不能直接在FROM子句中使用,就好像它是子查询或表一样.

也就是说,在发布:

SELECT * from events_by_type_2('social');

我们得到这个错误:

错误:返回的函数需要列定义列表

不过,SQL调用程序可以将其"转换"为正确的列类型.此表单确实有效:

SELECT * from events_by_type_2('social') as (id bigint, name text);

结果是:

 id |      name      
----+----------------
  1 | Dance Party
  2 | Happy Hour
 ...

因此,SETOF record被认为不太实用.只有在事先不知道结果的列类型时,才应使用它.

Postgresql相关问答推荐

如何在PostgreSQL中正确删除数据库

使用PythonPolar在PostgreSQL中存储

有没有办法共享数据或监控复杂 PostgresQL 事务的进度?

如何创建一个触发器来传播对主键表的更新?

如何在typeorm和嵌套js中将运行时变量设置为postgresql

如何将 grafana 与 Google Cloud SQL 集成

Postgres 会话处于空闲状态,query = COMMIT 或 ROLLBACK

当脚本工作时,Postgres now() 时间戳不会改变

Postgres COPY FROM csv file-No such file or directory

SQL:当谈到 NOT IN 和 NOT EQUAL TO 时,哪个更有效,为什么?

SQL数据库表中的多态性?

在 PL/pgSQL 中声明行类型变量

我怎样才能知道 Postgresql 表空间中有什么?

将属性添加到 Sequelize FindOne 返回的对象

如何删除 Postgres 上的所有数据库?

可以为空的列在 PostgreSQL 中是否会占用额外的空间?

Postgres Hstore 与 Redis - 性能方面

由于不支持身份验证类型 10,无法连接到 Postgres DB

如何在 PostgreSQL 中生成一系列重复数字?

PostgreSQL:如何解决numeric field overflow问题