PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL:Wie gibt man dynamische Zeilen aus einer Tabelle zurück, ohne die Spaltendefinitionsliste zu verwenden?

Die Handhabung von anyelement als Rückgabetyp ist in beschrieben Polymorphe Typen :

Dieses Argument ist in Ihrem Fall relation_name als anyelement eingegeben , und durch Übergeben von NULL::table1 , teilt dies dem Planer tatsächlich mit, dass dieser spezielle Aufruf von function1 sollte SETOF table1 zurückgeben . So weit, so gut.

Nun besteht das Problem darin, dass die Funktion nach der Ausführung nicht SETOF table1 zurückgibt aber etwas anderes. Das hat der Ausführende nicht erwartet, daher der Fehler.

Obwohl der Titel der Frage How to return dynamic rows... lautet , was Sie anscheinend wollen, sind dynamische Spalten oder polymorphe Ergebnismengen.

Und das ist ein harter Kampf mit SQL, denn um den Ausführungsplan einer Abfrage zu erstellen, muss der Planer jede Spalte mit ihrem Typ für jedes Zwischenergebnis kennen. Wenn Sie Ihre Abfrage mit einer Funktion entwerfen, die ausgeführt werden muss, um die Struktur ihrer Ausgabe zu finden, entsteht ein Henne-Ei-Problem:Die Planung muss der Ausführung vorausgehen, sie kann nicht davon abhängen.

Mit seiner dynamischen Type-Infering-Technik, die auf anyelement angewendet wird , geht PostgreSQL bereits an die Grenzen, um angesichts dieser Einschränkung so viel Polymorphismus wie möglich zu implementieren.