0

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()

チェン

4

1 に答える 1

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;

しかし、それはおそらくここでのポイントではありません。

于 2012-06-28T17:03:36.010 に答える