2012-06-28 82 views
0

我有一個PostgreSQL功能,其中只有一個SELECT語句:警告在PostgreSQL功能

CREATE OR REPLACE FUNCTION fun_test() 
RETURNS INTEGER AS $$ 
DECLARE size INTEGER; 
BEGIN 
    SELECT COUNT(*) INTO size FROM tab; 
    RETURN size; 
END; 
$$ LANGUAGE plpgsql STABLE; 

當我打電話與功能:

SELECT fun_test() 

雖然結果是正確的,就會有太多的警告:

WARNING: A stable or volatile function is used as if it is immutable 
HINT: The function should be declared as stable or volatile in create function statement. 

我發現PostgreSQL的文檔STABLE是,其結果取決於數據庫查找,參數變量(比如當前時區)功能的適當選擇等http://www.postgresql.org/docs/8.2/static/sql-createfunction.html

我的問題是在警告從何而來?看來我正在做文件要求做的事情。任何幫助表示讚賞。

編輯:
我使用PostgreSQL服務器8.2.15
原委:

CREATE TABLE algo.chengb_tmp 
(
userid INT, 
username varchar(100) 
) 

CREATE OR REPLACE FUNCTION algo.chengb_fun_test() 
RETURNS INTEGER AS $$ 
DECLARE size INTEGER; 
BEGIN 
    SELECT COUNT(*) INTO size FROM algo.chengb_tmp; 
    RETURN size; 
END; 
$$ LANGUAGE plpgsql STABLE; 

SELECT algo.chengb_fun_test() 

+1

您是否意外鏈接到過時的版本8.2或者是您的實際版本?如果是這樣,請先升級到更新的版本。 [8.2已於2011年12月達到其使用壽命。](http://www.postgresql.org/support/versioning/) –

+0

是的,我使用的是8.2.15版本。這個警告是否在更高版本中被刪除? – cheng

+1

我不能保證警告會隨着當前版本消失,但很可能會發生。如果您的問題更新現在顯示整個故事,我至少可以保證相同的設置不會在我的9.1.4安裝中發出警告。無法在8.2上進行測試,因爲...我當然沒有其他測試。如果您遇到8.2版本的問題,至少應升級到最新的可用次要版本,如推薦:8.2.23。而是安裝9.1。它在各個層面都好多了。 –

回答

1

很顯然,你的問題沒有顯示出整個故事。我在PostgreSQL 9.1中測試了你的函數,並且正如我所料,它適用於我。沒有警告。

可能的解釋包括:

  • 上所涉及的表tab調用另一個函數上選擇一個規則。 (SELECT沒有觸發器)

  • PostgreSQL版本8.2.15的過時錯誤,可能會因升級而消失。

  • 您過分簡化了問題,並將問題的實際原因抽象掉了。你的PostgreSQL,表tab的完整定義,完整的錯誤消息及其上下文的版本:

的問題添加更多詳細信息。


順便說一句,可以簡化:

CREATE OR REPLACE FUNCTION fun_test() 
RETURNS INTEGER AS 
$$ 
BEGIN 
    RETURN 
    (SELECT COUNT(*) FROM tab); 
END; 
$$ LANGUAGE plpgsql STABLE; 

礦石甚至:

CREATE OR REPLACE FUNCTION fun_test() 
RETURNS INTEGER AS 
$$ 
    SELECT count(*) FROM tab; 
$$ LANGUAGE sql STABLE; 

但是,這可能不是這裏的重點。