返回行的简单 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 函数的主要内容,如果未能解决你的问题,请参考以下文章

在简单的 PostgreSQL 函数返回表中避免“歧义列”

匿名函数 postgresql 的返回值

如何在 postgresql 中旋转 2 行的简单表?

PostgreSQL on Azure.cn : 安装部署

Postgresql c函数返回一行有2个字段

在 Postgresql 中创建一个具有多列作为参数的函数