【问题标题】:PostgreSQL Function Returning Table or SETOFPostgreSQL 函数返回表或 SETOF
【发布时间】:2015-05-08 14:52:31
【问题描述】:

快速背景:PostgreSQL 的新手,来自 SQL Server。我正在将存储过程从 SQL Server 转换为 PostgreSQL。我已阅读 Postgres 9.3 文档并查看了大量示例和问题,但仍然找不到解决方案。

我有这个选择语句,我每周执行一次以返回新值

select distinct id, null as charges
     , generaldescription as chargedescription, amount as paidamount
from mytable
where id not in (select id from myothertable)

我该怎么做才能把它变成一个我可以每周右键单击并执行的功能。最终,我将使用另一个开发人员构建的程序自动执行此操作。因此它将在没有用户参与的情况下执行,并将结果以电子表格的形式发送给用户。不确定最后一部分是否与函数的编写方式有关。

这是我多次失败的尝试之一:

CREATE FUNCTION newids
RETURNS TABLE (id VARCHAR, charges NUMERIC
             , chargedescription VARCHAR, paidamount NUMERIC) AS Results
Begin
SELECT DISTINCT id, NULL AS charges
     , generaldescription AS chargedescription, amount AS paidamount
FROM mytable
WHERE id NOT IN (SELECT id FROM myothertable)
END;
$$ LANGUAGE plpgsql;

我也在使用 Navicat,错误是:

必须指定函数结果类型

【问题讨论】:

  • 你需要使用LANGUAGE sql
  • 使用 Navicat 工具创建函数时仍然收到相同的错误。如果我在查询编辑器窗口中执行命令,它会在 RETURNS 处或附近给我一个语法错误

标签: sql postgresql stored-procedures plpgsql


【解决方案1】:

可以在这里使用 PL/pgSQL,它甚至可能是更好的选择。

但您需要修复语法错误match your dollar-quoting,添加显式转换 (NULL::numeric) 并使用 RETURN QUERY

CREATE FUNCTION newids_plpgsql()
  RETURNS TABLE (
     id         varchar
   , charges    numeric
   , chargedescription varchar
   , paidamount numeric
   ) AS  -- Results  -- remove this
$func$
BEGIN

RETURN QUERY
SELECT ...;

END;
$func$ LANGUAGE plpgsql;

或者使用简单的SQL函数:

CREATE FUNCTION newids_sql()
  RETURNS TABLE (
     id         varchar
   , charges    numeric
   , chargedescription varchar
   , paidamount numeric
   ) AS
$func$
SELECT ...;
$func$ LANGUAGE sql;

无论哪种方式,SELECT 语句都可以更高效:

SELECT DISTINCT t.id, NULL::numeric AS charges
     , t.generaldescription AS chargedescription, t.amount AS paidamount
FROM   mytable t
LEFT   JOIN myothertable m ON m.id = t.id
WHERE  m.id IS NULL;

当然,所有数据类型都必须匹配。我不知道,表定义丢失了。
你确定你需要DISTINCT吗?

【讨论】:

  • 谢谢。很多有用的信息。有时我们在该表中有重复的行,所以我保留 Distinct 以清除它们。
猜你喜欢
  • 2013-07-25
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多