Als u met "gebaseerd op een bekende tabel" bedoelt "precies als een bekende tabel", dan ja .
SQL is een strikt getypeerde taal en functies moeten worden gemaakt met een goed gedefinieerd retourtype. U kunt terugvallen op anonieme records zoals je duidelijk deed (met RETURNS SETOF record
), maar dan moet u voor elke aanroep een kolomdefinitielijst toevoegen, zoals de foutmelding aangeeft. Iets als:
SELECT *
FROM my_function('foo') AS foo (
colum_name1 integer -- name and data type for every column
, colum_name2 text
, colum_name3 real);
En dit is nauwelijks dynamisch.
Uw vraag laat ruimte voor interpretatie, maar "gebaseerd op een bekende tabel" zou aangeven dat een polymorfe functie zou kunnen lukken. Het retourtype kan dynamisch worden gebaseerd op elk geregistreerd rijtype en er is er automatisch een voor elke tabel in het systeem. Barebone-code voorbeeld:
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;
Bel:
SELECT * FROM my_function(NULL::my_table);
Gedetailleerde instructies in dit gerelateerde antwoord (kijk naar het laatste hoofdstuk "Verschillende complete tabeltypes" ):