web-dev-qa-db-ja.com

テーブルを返す型なし関数

私は、MSSQLおよびMySQLで私が知っている愛するストアドプロシージャのように本質的に動作するPostgreSQLストアド関数を書きたいと思います。ここで、パラメーターをとらないクエリをラップし、出力の形式を指定せずにその結果セットを返すことができます。クエリを更新するたびにその定義を変更します。これはPostgreSQLでも可能ですか?

PostgreSQL 9.2を使用して次のことを試しました。

CREATE OR REPLACE FUNCTION test()
RETURNS SETOF record

これは私に次のエラーを与えます:

エラー:「レコード」を返す関数には列定義リストが必要です

私も試しました:

CREATE OR REPLACE FUNCTION test()
RETURNS table ()

しかし、明らかにそれは無効な構文です。

2
swrobel

これは誤解です。このような関数は完全に有効です:

_CREATE OR REPLACE FUNCTION test()
 RETURNS SETOF record AS
$func$
VALUES (1, 2), (3, 4);  -- 2 rows with 2 integer columns
$func$ LANGUAGE sql;
_

ただし、匿名のレコードを返すため、エラーメッセージで通知されているように、列定義リストとすべての call を提供する必要があります。 SQLは、関数から何を期待するかを事前に知る必要があります。呼び出しは次のように機能します。

SELECT * FROM test() AS f(a int, b int);

匿名レコードを返す関数には用途があります。呼び出しがかなり扱いにくいので、私はそれらをほとんど避けようとします。正確な要件に応じて、いくつかの方法があります。私は SOに関する包括的な回答 を最近書きました。

2