sql - PostgreSQL 函数返回表或 SETOF

标签 sql postgresql stored-procedures plpgsql

快速背景: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,报错是:

function result type must be specified

最佳答案

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

关于sql - PostgreSQL 函数返回表或 SETOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30126789/

相关文章:

sql - postgresql 挑战 : how to select sum of one column having another column like 'ab%'

MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号?

php - 如何创建与我的 php 函数执行类似工作的程序(优化加速)

c# - 如何让 Linq to SQL 识别动态存储过程的结果集?

mysql - 在插入时启动触发器和例程

sql - 在不同的数据库中搜索相关数据

Postgresql 10 逻辑复制 MultiMaster

java - 使用 sql 保存图像 hibernate (不要 hql)

sql - 内部联接选择结果与表

sql-server - 为什么我损坏的存储过程被删除了?