PostgreSQL数学函数错误
我从一个确定性PG函数中得到一个错误,它似乎依赖于我在查询中调用它的时间 功能是:PostgreSQL数学函数错误,sql,database,postgresql,Sql,Database,Postgresql,我从一个确定性PG函数中得到一个错误,它似乎依赖于我在查询中调用它的时间 功能是: CREATE OR REPLACE FUNCTION ircm(starting_money numeric, value numeric, days numeric) RETURNS numeric AS $$ BEGIN -- Calculate effective interest rate, compounded monthly. RETURN 12*(pow((value/starting_mo
CREATE OR REPLACE FUNCTION ircm(starting_money numeric, value numeric, days numeric)
RETURNS numeric
AS $$
BEGIN
-- Calculate effective interest rate, compounded monthly.
RETURN 12*(pow((value/starting_money),(1./(12.*(days/365.)))) - 1);
END;
$$ LANGUAGE plpgsql;
如果我在一个简单的SELECT语句中调用它,它可以正常工作:
SELECT ircm(100.00,60.427500643787215,30)
Result: -4.79925436505569765596
但是,当我使用子查询从不同的SELECT语句运行完全相同的调用时:
SELECT
ircm(100.00,m.v::numeric,30) AS result
FROM(
SELECT 60.427500643787215 AS v
) m
我得到一个错误:
ERROR: a negative number raised to a non-integer power yields a complex result
CONTEXT: PL/pgSQL function "ircm" line 6 at RETURN
既然这些调用在逻辑上是等价的,PG如何能够为一个调用返回错误,而不为另一个调用返回错误?我已经确定在我的数据库中只有一个函数“ircm”的定义。我已尝试再次删除/添加它,以确保PG不会以某种方式缓存损坏的定义 您的数据库运行在哪个版本和平台上 您是否尝试过在SQL中重写函数:
CREATE OR REPLACE FUNCTION ircm(numeric, numeric, numeric)
RETURNS numeric AS $$
select 12 * (pow(($2 / $1), (1. / (12.* ($3 / 365.)))) - 1);
$$ LANGUAGE sql immutable;
我在Solaris、Linux和Mac OS X上运行v8.4.4,并从直接调用的plpgsql(和我的SQL)版本以及子查询中获得相同的结果。我刚刚在我的机器(版本8.4)上进行了尝试第二行对我有效,返回
-4.79925436505569765596
如果您添加行提高通知“value/starting_money%”,value/starting_money代码>输入。这是作为一种能力而提出的部分,至少消息选项卡中的print语句可以确保使用了正确的函数。这里也一样:给出的示例适用于Windows上的8.4.3(通过JDBC查询工具)。因此,要么这是您的PostgreSQL版本中的错误,要么您没有向我们展示完整的图片。