2017-01-23 3 views
0

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.

+2

Erwähnen Sie den Grund im Kommentar für die Abstimmung nach unten. – MAK

+0

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

+2

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. –

Antwort

0

Sie müssen RETURNS RECORD oder RETURNS SETOF RECORD verwenden.

Aber dann muss der Aufrufer beim Aufruf der Funktion die Spaltenliste angeben. Der Planer von PostgreSQL weiß derzeit nicht, wie er die Funktion ausführen soll, um seine Ergebnisspaltenliste zu ermitteln, und analysiert dann den Rest der Abfrage, wenn er die Ergebnisspaltenliste für die Funktion kennt.

Weitere Informationen finden Sie im Kapitel PostgreSQL-Dokumentation über die Rückgabe von Datensätzen.

Verwandte Themen