2017-01-23 10 views
0

私は、与えられた条件に基づいて別のテーブルからレコードを返すために、関数を に持っています。PostgreSQL 9.5:動的列のリストを返す

機能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; 

:私は関数内でチェックするには多くの条件があります。

検索すると、私は約Polymorphic Typesを知りました。しかし、私はそれほど多くを作成することは本当に良い考えだとは思わないComposite types

+2

落札のコメントの理由を述べます。 – MAK

+0

['declare cursor'](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

@Abelistoのヒントには、カーソルの回避策がありますが、間違ったデザインのシグナルです - PL関数は既知の安定型のスカラー、配列、またはテーブルを返します。 PLpgSQL(PostgreSQL)はかなり静的です。動的言語やMSSQLのパターンは現実的ではなく、ここで利用できます。コンパイラのようなPostgresについては、PLpgSQLについて考えてみてください。たぶん、あなたのデザインは若干の再考が必要かもしれません。 –

答えて

0

RETURNS RECORDまたはRETURNS SETOF RECORDを使用する必要があります。

しかし、呼び出し元は、関数を呼び出すときにcolumn-listを指定する必要があります。 PostgreSQLのプランナは現在、関数を実行してresult-columns-listを決定し、その後、関数の結果列リストを知った後、残りのクエリを解析して計画します。

レコードを返すPostgreSQLのドキュメントの章を参照してください。

関連する問題