返回行的简单 PostgreSQL 函数
Posted
技术标签:
【中文标题】返回行的简单 PostgreSQL 函数【英文标题】:Simple PostgreSQL function to return rows 【发布时间】:2012-12-20 03:36:45 【问题描述】:如何将select * from customers
之类的简单选择查询转换为 pg 中的存储过程/函数?
我是 Postgres 的新手,create function customers() as returns table/setof
只是感觉不对,因此这里有问题。
我知道 proc 在 pg 领域被称为“函数”。因此 不存在,我唯一的选择是创建视图或函数。问题是create procedure
create function x() returns setof y
返回一个以逗号分隔的值行,如果没有进一步处理就无法使用(至少这是我在 pgAdmin 和 Ruby/Sequel 中看到的)。
create function x() returns table(...)
要求我嵌入我不想嵌入的行定义。
我确信这一切背后都有一个原因,但我很惊讶最常见的用例就是这么棘手。
【问题讨论】:
What have you tried? @rebnoob 而不是“不起作用” - 指定您尝试的函数的全文和产生的错误消息以及您的 PostgreSQL 版本。 太棒了!谢谢欧文和克雷格。 那么这个问题的答案是否正确? 【参考方案1】:未经测试,但应该是正确的:
CREATE OR REPLACE FUNCTION getcustomers() RETURNS SETOF customers AS $$
SELECT * FROM customers;
$$ LANGUAGE sql;
【讨论】:
这行得通,谢谢。但是 pg 似乎只返回一列用逗号分隔的值而不是实际的列,这是什么给出的? @rebnoob 你用SELECT x FROM getcustomers() x
之类的东西来称呼它。您想使用SELECT getcustomers();
或SELECT * FROM getcustomers();
。【参考方案2】:
问题是“创建函数 x() 返回 setof y”返回一个括号 逗号分隔的行值,未经进一步处理就无法使用
函数返回一行。要分解成单独的列,调用它:
SELECT * FROM getcustomers();
假设函数定义了正确的返回类型。见:
How to return multiple rows from PL/pgSQL function?manual on CREATE FUNCTION
应该是一个很好的起点。示例部分涵盖了这个主题。
【讨论】:
你先生..是绝地武士和不可忽视的力量! 浪费了 1 天时间来了解问题所在。我在没有“* from”部分的情况下调用函数,EF Core 给出了关于数据库模型映射的错误。因为数据是逗号,分隔的。谢谢:) 我知道了a column definition list is required for functions returning "record"
@TheRealChx101:见:***.com/a/17281457/939860以上是关于返回行的简单 PostgreSQL 函数的主要内容,如果未能解决你的问题,请参考以下文章