我有一个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()
成
答案 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;
但这可能不是重点。