从 PostgreSQL 函数返回具有特定参数的表

Posted

技术标签:

【中文标题】从 PostgreSQL 函数返回具有特定参数的表【英文标题】:Returning table with specific parameters from a PostgreSQL function 【发布时间】:2020-04-06 21:08:41 【问题描述】:

我有这个函数,我想用它返回一个包含两列的表:game_namefollow(这将是一个整数 0 或 1):

CREATE OR REPLACE FUNCTION public.toggle2(uid numeric, gid NUMERIC)
    RETURNS TABLE (
        follow INT,
        game_name TEXT
    )
    LANGUAGE plpgsql
AS $$
    BEGIN
        IF NOT EXISTS(SELECT * 
                  FROM game_follows 
                 WHERE user_id = uid and game_id = gid)
                 THEN
    INSERT INTO game_follows(user_id, game_id) VALUES(uid, gid);
    follow := 1;
  ELSE
     DELETE FROM game_follows WHERE user_id = uid and game_id = gid;
     follow := 0;
  END IF;
 SELECT name INTO game_name FROM games WHERE id = gid;
    END;
$$
;

遗憾的是,该函数返回空值。我是这样使用它的:

SELECT * FROM toggle2(83, 12);

【问题讨论】:

请始终公开您的 Postgres 版本。也是最有帮助的:显示数据类型和约束的表定义(CREATE TABLE 语句)。最重要的是,(user_id, game_id) 上是否有 UNIQUE 约束或索引?并发写访问是可能的吗? 【参考方案1】:

声明为 RETURN TABLE 的函数可以返回 0-n 行。 您必须主动返回行,否则不会返回任何内容(无行)。一种方法:

RETURN NEXT; -- as last line before END;

还有其他方法,see the manual.

但是,您似乎希望每次只返回一行。所以宁可使用OUT参数:

CREATE OR REPLACE FUNCTION public toggle2(uid numeric, gid numeric, OUT follow int, OUT game_name text) AS ...

然后分配那些OUT参数就足够了,它们会自动返回到单个结果行中。

见:

Returning from a function with OUT parameter plpgsql error "RETURN NEXT cannot have a parameter in function with OUT parameters" in table-returning function How to return result of a SELECT inside a function in PostgreSQL?

【讨论】:

函数的更多方面可以改进:对并发写入不安全;奇数数据类型;效率低下;命名约定?但这超出了实际问题的范围 - 否则细节很模糊。 另外:IF... 很糟糕。可以改写成合理的语法。 @ErwinBrandstetter 感谢您的回复,为什么我想返回表是因为我会在我的节点 js 后端使用数据作为 JSON。如果没有参数,它会返回一个字符串:“(1,'game_name')”,这不是很理想的结果,并且宁愿在可能是json格式的地方返回表格 @r.Die:不,你仍然得到一个。像以前一样拨打SELECT * FROM ... 感谢您的澄清!

以上是关于从 PostgreSQL 函数返回具有特定参数的表的主要内容,如果未能解决你的问题,请参考以下文章

如何在postgresql中查找具有特定列的表

TSQL UDF 根据第一个函数参数的值返回具有不同列数的表

Postgresql函数返回有变化的表

在 WHILE LOOP 部分之后从 PostgreSQL 函数返回 SETOF 行

如何在 PostgreSQL 中列出具有相应大小的表的所有索引?

PostgreSQL 中具有特定模式的 Linq 和实体迁移