2012-06-28 54 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; 

但是,这可能不是这里的重点。