Håndteringen af anyelement
som returtype er beskrevet i Polymorfe typer
:
Dette argument i dit tilfælde er relation_name
indtastet som anyelement
, og ved at sende NULL::table1
, dette fortæller faktisk planlæggeren, at dette særlige kald af function1
skal returnere SETOF table1
. Så langt så godt.
Nu er problemet, at når den først er udført, returnerer funktionen ikke SETOF table1
men noget andet. Dette er ikke, hvad bobestyreren forventede, derfor fejlen.
På trods af at titlen på spørgsmålet er Hvordan returneres dynamiske rækker... , hvad du ser ud til at ønske dig, er dynamiske kolonner eller polymorfe resultatsæt.
Og dette er en kamp op ad bakke med SQL, for for at opbygge udførelsesplanen for en forespørgsel, skal planlæggeren kende hver kolonne med dens type for hvert mellemresultat. Hvis du designer din forespørgsel med en funktion, der skal udføres for at finde strukturen af dens output, hvilket skaber et hønse- og ægproblem:planlægning skal gå forud for udførelse, den kan ikke afhænge af det.
Med sin dynamiske type-infererende teknik anvendt på anyelement
, PostgreSQL skubber allerede til envelope for at implementere så meget polymorfi som muligt givet denne begrænsning.