Ich habe die folgende Funktion, um die Datensätze aus verschiedenen Tabellen basierend auf der gegebenen Bedingung die Funktion zurückgeben.PostgreSQL 9.5: Return dynamische Spalten Liste
Funktion: udf_dynamic_returns
CREATE OR REPLACE FUNCTION udf_dynamic_returns
(
condition_name varchar(10)
)
RETURNS ????
AS
$BODY$
BEGIN
IF condition_name = 'A'
THEN
SELECT col1,col2,col3
FROM Test
ELSE IF condition_name = 'B'
THEN
SELECT col21col22,col23,col24,col25
FROM Kon
ELSE IF condition_name = 'C'
THEN
SELECT col31,col32
FROM Mat
ELSE IF condition_name = 'D'
THEN
SELECT col4,col5,col6,col7,col8,col9
FROM Test
......
......
END IF
END;
$BODY$
LANGUAGE PLPGSQL;
Hinweis: Ich habe viele Bedingungen innerhalb der Funktion zu überprüfen.
Durch die Suche kam ich über Polymorphic Types. Aber ich denke nicht, dass es wirklich eine gute Idee ist, so viele Composite types
zu erstellen.
Erwähnen Sie den Grund im Kommentar für die Abstimmung nach unten. – MAK
Schauen Sie sich den "decursor cursor" an (https://www.postgresql.org/docs/current/static/sql-declare.html), ['prepare'] (https://www.postgresql.org/ docs/current/static/sql-prepare.html), ['create temp view'] (https://www.postgresql.org/docs/current/static/sql-createview.html), [' plpgsql refcursors'] (https://www.postgresql.org/docs/current/static/plpgsql-cursors.html) – Abelisto
Es gibt Workaround mit Cursors - @Abelisto Hinweis - aber mehr oder weniger ist es Signal des falschen Designs - jede PL-Funktion sollte zu Gibt Skalar, Array oder Tabelle mit bekanntem stabilen Typ zurück. PLpgSQL (PostgreSQL) ist ziemlich statisch - die Muster aus dynamischen Sprachen oder aus MSSQL sind nicht praktisch, hier verfügbar. Denken Sie an PLpgSQL, über Postgres sind sie wie Compiler. Vielleicht braucht Ihr Design ein Umdenken. –