PostgreSQL函数返回表或SETOF

时间:2015-05-08 14:52:31

标签: sql postgresql stored-procedures plpgsql

快速背景:对于PostgreSQL来说非常新,来自SQL Server。我正在努力将存储过程从SQL Server转换为PostgreSQL。我阅读了Postgres 9.3文档并查看了大量示例和问题,但仍无法找到解决方案。

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

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,错误是:

  

必须指定函数结果类型

1 个答案:

答案 0 :(得分:4)

可以在这里使用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吗?