【问题标题】:Simple PostgreSQL function to return rows返回行的简单 PostgreSQL 函数
【发布时间】: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(...) 要求我嵌入我不想嵌入的行定义。

我确信这一切背后都有一个原因,但我很惊讶最常见的用例就是这么棘手。

【问题讨论】:

  • @rebnoob 而不是“不起作用” - 指定您尝​​试的函数的全文和产生的错误消息以及您的 PostgreSQL 版本。
  • 太棒了!谢谢欧文和克雷格。
  • 那么这个问题的答案是否正确?

标签: postgresql function stored-procedures types


【解决方案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();

假设函数定义了正确的返回类型。见:

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

【讨论】:

  • 你先生..是绝地武士和不可忽视的力量!
  • 浪费了 1 天时间来了解问题所在。我在没有“* from”部分的情况下调用函数,EF Core 给出了关于数据库模型映射的错误。因为数据是逗号,分隔的。谢谢:)
  • 我知道了a column definition list is required for functions returning "record"
  • @TheRealChx101:见:stackoverflow.com/a/17281457/939860
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 2013-07-25
  • 2012-09-13
  • 2012-01-09
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多