「既知のテーブルに基づく」とは、「既知のテーブルとまったく同じ」を意味する場合、はい 。
SQLは厳密に型指定された言語であり、関数は明確に定義された戻り型で作成する必要があります。 匿名のレコードにフォールバックできます あなたが明らかにしたように(RETURNS SETOF record
)。ただし、エラーメッセージに示されているように、呼び出しごとに列定義リストを追加する必要があります。次のようなもの:
SELECT *
FROM my_function('foo') AS foo (
colum_name1 integer -- name and data type for every column
, colum_name2 text
, colum_name3 real);
そして、これはほとんど動的ではありません。
あなたの質問は解釈の余地がありますが、「既知の表に基づいて」 ポリモーフィック関数を示します トリックをするかもしれません。戻りタイプは、登録されている任意の行タイプに動的に基づくことができ、システム内のすべてのテーブルに自動的に1つあります。ベアボーンコードの例:
CREATE OR REPLACE FUNCTION my_function(_rowtype anyelement)
RETURNS SETOF anyelement AS
$func$
BEGIN
RETURN QUERY EXECUTE format(
'SELECT * FROM %s LIMIT 10'
, pg_typeof(_rowtype) -- pg_typeof() returns regtype, quoted where necessary
);
END
$func$ LANGUAGE plpgsql;
電話:
SELECT * FROM my_function(NULL::my_table);
この関連する回答の詳細な手順(最後の章「さまざまな完全なテーブルタイプ」を参照してください。 ):