Jeśli przez „na podstawie znanej tabeli” masz na myśli „dokładnie jak w znanej tabeli”, to tak .
SQL jest językiem ściśle typizowanym i funkcje muszą być tworzone z dobrze zdefiniowanym typem zwracanym. Możesz wrócić do anonimowych rekordów tak jak to zrobiłeś (z RETURNS SETOF record
), ale musisz dodać listę definicji kolumn dla każdego wywołania, tak jak mówi komunikat o błędzie. Coś takiego:
SELECT *
FROM my_function('foo') AS foo (
colum_name1 integer -- name and data type for every column
, colum_name2 text
, colum_name3 real);
A to nie jest dynamiczne.
Twoje pytanie pozostawia pole do interpretacji, ale „na podstawie znanej tabeli” wskazuje, że funkcja polimorficzna może załatwić sprawę. Zwracany typ może być dynamicznie oparty na dowolnym zarejestrowanym typie wiersza, a dla każdej tabeli w systemie jest automatycznie jeden. Przykład kodu kadłubka:
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;
Zadzwoń:
SELECT * FROM my_function(NULL::my_table);
Szczegółowe instrukcje w tej powiązanej odpowiedzi (patrz ostatni rozdział "Różne kompletne typy tabel" ):