为啥我的 plpgsql 函数不返回任何行

Posted

技术标签:

【中文标题】为啥我的 plpgsql 函数不返回任何行【英文标题】:why does my plpgsql function return no rows为什么我的 plpgsql 函数不返回任何行 【发布时间】:2017-05-06 19:59:43 【问题描述】:

当两个查询对用户独立运行时,我得到结果 300 和 0,但是在我的函数中我没有返回任何行。

我正在从 SQL Server 迁移到 PostgresSQL,所以有些事情对我来说有点陌生!

create or replace function getsummary(userid int)
returns table (assetTotal numeric, liabilityTotal numeric)
as $$
BEGIN

SELECT sum(t.credit) - sum(t.debit)
into assetTotal
    from transactions t
    join user_institutes i on t.user_institute_id = i.id
    where i.account_type in (1,3,4,5)
    and i.user_id = userid;

    select sum(t.credit) - sum(t.debit)
    into liabilityTotal
    from transactions t
    join user_institutes i on t.user_institute_id = i.id
    where i.account_type in (2,8,10)
    and i.user_id = userid;
END
$$ language plpgsql;

select * from getsummary(1)

非常感谢

【问题讨论】:

它可能还说 and 没有返回?.. 那是因为你没有任何 out 参数并且不返回任何东西......你实际插入到assetTotal 表中?.. @VaoTsun,不,只是说没有返回行和执行时间。所以我认为插入 x 到 x 填满我的表是错误的?现在我想我是否想以某种方式插入一行并将其插入表中以返回? 哦 - 我认为 OP 意味着他正在从 t-SQL 转移到 plpgsql :) @a_horse_with_no_name。我的意思是我以前没有使用过 postgres 数据库,我的知识完全在 mssql/mysql 中。我不知道如何将 sql 存储过程转换为 postgresql 函数。 【参考方案1】:

没有深入了解您的查询,只是指出缺少的部分。试试?:

create or replace function getsummary(userid int)
returns table (assetTotal numeric, liabilityTotal numeric)
as $$
DECLARE
 _assetTotal numeric;
 _liabilityTotal numeric;
BEGIN

SELECT sum(t.credit) - sum(t.debit)
into _assetTotal
    from transactions t
    join user_institutes i on t.user_institute_id = i.id
    where i.account_type in (1,3,4,5)
    and i.user_id = userid;

    select sum(t.credit) - sum(t.debit)
    into _liabilityTotal
    from transactions t
    join user_institutes i on t.user_institute_id = i.id
    where i.account_type in (2,8,10)
    and i.user_id = userid;
  return query select _assetTotal, _liabilityTotal;
END
$$ language plpgsql;

【讨论】:

谢谢!我不得不将声明的类型更改为数字,但这成功了!

以上是关于为啥我的 plpgsql 函数不返回任何行的主要内容,如果未能解决你的问题,请参考以下文章

如何在不创建函数的情况下运行 plpgsql?

如何将参数从 bat 文件或命令行传递给 plpgsql 函数?

在 plpgsql 中以编程方式访问记录的列

尝试使用 RETURNING 和更新/插入从 plpgsql 函数返回时出错

plpgsql 错误:RETURN 在返回 void 的函数中不能有参数

plpgsql 专家:(记录集)函数的输入和输出