【问题标题】:Postgresql Error - Function return type mismatchPostgresql 错误 - 函数返回类型不匹配
【发布时间】:2018-08-09 20:35:41
【问题描述】:

我正在寻找一些关于我在 pgAdmin3 下为 PostGreSQL 定义的 SQL 函数的帮助。

这是一个简单的函数,应该计算给定某个 id 的比率,但是当我尝试添加该函数时,我收到一条错误消息。
这是函数的代码:

CREATE OR REPLACE FUNCTION data.func_net_exposure(id_fund_arg text)
RETURNS real AS

$BODY$

DECLARE
    net_exposure real;
    AUM smallint;

BEGIN
    AUM := (SELECT sum(cash_fund_total) from main.main_cash where id_fund = id_fund_arg); 
    net_exposure := (SELECT ROUND(sum(exposure_eur)/(100*AUM)) from main.main_inventory where id_fund = id_fund_arg); 
    return net_exposure;
END;

$BODY$

这是我尝试添加函数时收到的错误消息:

发生错误:

13:13:54:错误:错误:在声明的函数中返回类型不匹配 return real DETAIL:函数的最终语句必须是 SELECT 或 插入/更新/删除返回。上下文:SQL 函数 “func_net_exposure”

关于如何解决这个错误的任何线索?

【问题讨论】:

  • 您缺少该函数的语言规范。它看起来像一个 PL/pgSQL 函数,但系统可能认为它是一个 SQL 函数,正如错误消息所暗示的那样。虽然我想知道它是如何以这种方式编译的。
  • 哦,是的,这正是发生的事情,我在函数的 pgadmin 定义中将默认设置为“sql”,而不是“plpgsql”。感谢您指出这一点!如果您想发表评论作为答案,我会将其标记为解决方案。

标签: sql postgresql pgadmin


【解决方案1】:

系统认为函数的语言是 SQL,因此期望最后一条语句是 SELECT... RETURNING。语言应该是 PL/pgSQL。添加语言规范,如:

CREATE OR REPLACE FUNCTION data.func_net_exposure(id_fund_arg text)
RETURNS real AS

$BODY$

...

$BODY$
LANGUAGE PLpgSQL;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多