0

我有一个 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.

I found in Postgresql document that STABLE is a appropriate selection for functions whose results depend on database lookups, parameter variables (such as the current time zone), etc. 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()

4

1 回答 1

1

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

可能的解释包括:

  • tab调用另一个函数的相关表上的 SELECT 规则。(SELECT 没有触发器)

  • 过时的 PostgreSQL 版本 8.2.15 中的错误,升级后可能会消失。

  • 您过度简化了问题并抽象出问题的实际原因。

在问题中添加更多详细信息:您的 PostgreSQL 版本、 table 的完整定义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;

但这可能不是重点。

于 2012-06-28T17:03:36.010 回答