Pokud výrazem „na základě známé tabulky“ myslíte „přesně jako u známé tabulky“, pak ano .
SQL je striktně typovaný jazyk a funkce musí být vytvořeny s dobře definovaným návratovým typem. Můžete se vrátit k anonymním záznamům jako jste to zjevně udělali (se záznamem RETURNS SETOF record
), ale pak musíte pro každé volání přidat seznam definic sloupců, jak vám říká chybová zpráva. Něco jako:
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 je sotva dynamické.
Vaše otázka ponechává prostor pro interpretaci, ale "na základě známé tabulky" by znamenalo, že jde o polymorfní funkci mohl udělat trik. Návratový typ může být založen na libovolném registrovaném typu řádku dynamicky a pro každou tabulku v systému je automaticky jeden. Příklad bosého kódu:
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;
Volejte:
SELECT * FROM my_function(NULL::my_table);
Podrobné pokyny v této související odpovědi (podívejte se na poslední kapitolu "Různé kompletní typy tabulek" ):