2010-08-14 97 views
1

我得到一個確定性的PG函數的錯誤,這個函數看起來依賴於我在查詢中調用它的時間。PostgreSQL數學函數錯誤

功能是:

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不會緩存已損壞的定義。

+1

我剛試過我的機器(版本8.4),第二個適用於我並返回'-4.79925436505569765596' – 2010-08-14 19:40:13

+0

如果添加'RAISE NOTICE'值/ starting_money%'行,值/ starting_money;這是你作爲一個強大的部分,至少在消息選項卡中的打印語句的存在將確保你正在使用正確的功能。 – 2010-08-14 20:07:47

+0

與此相同:給出的示例在Windows上使用8.4.3(通過JDBC查詢工具)。所以無論這是你的PostgreSQL版本的錯誤,還是你沒有向我們展示完整的圖片。 – 2010-08-16 15:58:27

回答

0

哪個版本以及您的數據庫在哪個平臺上運行?

您是否嘗試過重寫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)相同的結果版本直接調用,並從子查詢中調用。