在Postgresql函数中使用“稳定或易变函数,就好像它是不可变的”警告一样

时间:2012-06-28 13:48:47

标签: sql postgresql

我有一个Postgresql函数,其中只有一个SELECT语句:

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 个答案:

答案 0 :(得分:1)

显然,你的问题没有显示整个故事。我在PostgreSQL 9.1中测试了你的功能,它对我有用,正如预期的那样。没有警告。

可能的解释包括:

  • 调用另一个函数的所涉及的表tab上的SELECT上的规则。 (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;

但这可能不是重点。