私は、MSSQLおよびMySQLで私が知っている愛するストアドプロシージャのように本質的に動作するPostgreSQLストアド関数を書きたいと思います。ここで、パラメーターをとらないクエリをラップし、出力の形式を指定せずにその結果セットを返すことができます。クエリを更新するたびにその定義を変更します。これはPostgreSQLでも可能ですか?
PostgreSQL 9.2を使用して次のことを試しました。
CREATE OR REPLACE FUNCTION test()
RETURNS SETOF record
これは私に次のエラーを与えます:
エラー:「レコード」を返す関数には列定義リストが必要です
私も試しました:
CREATE OR REPLACE FUNCTION test()
RETURNS table ()
しかし、明らかにそれは無効な構文です。
これは誤解です。このような関数は完全に有効です:
_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に関する包括的な回答 を最近書きました。