Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL数学函数错误_Sql_Database_Postgresql - Fatal编程技术网

PostgreSQL数学函数错误

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

我从一个确定性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_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版本中的错误,要么您没有向我们展示完整的图片。