返回行的简单PostgreSQL函数

17
如何将一个简单的查询语句如select * from customers转换为pg中的存储过程/函数?
我对Postgres不熟悉,create function customers() as returns table/setof感觉不太对,所以有了这个问题。
我知道在pg中procs被称为"functions"。因此,create procedure不存在,我的选择只能是创建视图或函数。问题在于create function x() returns setof y返回带括号和逗号分隔的一行值,需要进一步处理才能使用(至少在pgAdmin和Ruby/Sequel中是这样的)。 create function x() returns table(...)要求我嵌入行定义,而我不想这么做。
我相信这背后有原因,但我很惊讶最常见的用例竟然这么棘手。

2
@rebnoob 不要说“没用”,请具体说明你尝试的函数完整文本和出现的错误信息,以及你使用的PostgreSQL版本。 - Craig Ringer
太好了!谢谢Erwin和Craig。 - Sunder
这个问题得到了适当的回答吗? - Erwin Brandstetter
2个回答

21

未经测试,但应该差不多正确:

CREATE OR REPLACE FUNCTION getcustomers() RETURNS SETOF customers AS $$
SELECT * FROM customers;
$$ LANGUAGE sql;

3
可以,这个可以运行,谢谢。但是pg返回的似乎只是一个带逗号分隔值的列,而不是实际列,原因是什么? - Sunder
4
你正在使用类似于“SELECT x FROM getcustomers() x”的东西进行调用。你应该使用“SELECT getcustomers();”或者“SELECT * FROM getcustomers();”。 - Craig Ringer

19

问题在于,"create function x() returns setof y" 返回一个带括号的逗号分隔行值,需要进一步处理才能使用。

该函数返回一行结果。要将其分解为单独的列,请使用以下方法调用:

SELECT * FROM getcustomers();

假设函数定义了适当的返回类型。请参见:

CREATE FUNCTION的手册应该是一个很好的起点。示例部分涵盖了这个主题。


2
您好,您是一位绝地武士和值得关注的强者! - faizanjehangir
浪费了一天的时间才明白问题所在。我调用函数时没有加上“* from”部分,EF Core会报关于数据库模型映射的错误。因为数据是逗号分隔的。谢谢 :) - balron
需要为返回“record”的函数提供列定义列表。 - TheRealChx101
@TheRealChx101:请参见:https://dev59.com/u2Qm5IYBdhLWcg3w6Car#17281457 - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接