从 PostgreSQL 函数返回具有特定参数的表
Posted
技术标签:
【中文标题】从 PostgreSQL 函数返回具有特定参数的表【英文标题】:Returning table with specific parameters from a PostgreSQL function 【发布时间】:2020-04-06 21:08:41 【问题描述】:我有这个函数,我想用它返回一个包含两列的表:game_name
和 follow
(这将是一个整数 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 函数返回具有特定参数的表的主要内容,如果未能解决你的问题,请参考以下文章
TSQL UDF 根据第一个函数参数的值返回具有不同列数的表
在 WHILE LOOP 部分之后从 PostgreSQL 函数返回 SETOF 行