PostgreSQL関数が「任意の」型を返すことは可能ですか?

いくつかのPostgreSQL関数に対して任意の戻り値型を定義することは可能ですか?

アイデアは、呼び出しに応じて、出力が異なる返されることがあります。

たとえば、次のようにします。

TypeA : (name, email)
TypeB : (name, email, address, phone)

私たちは機能を持つかもしれません:

func1(name varchar);

But return type could be either: TypeA or TypeB

ですから、func1を定義することは可能ですか?その結果、任意の戻り値の型は機能しますか?

編集:

解決策が refcursor の場合...誰かが私の質問の例に基づいて答えを書いてもらえますか?それはたくさんの助けになります!

0
グレン、ありがとう、しかし、あなたは小さな例を挙げてください。それはすごく助けになるでしょう。
追加された 著者 Larry,
refcursorを返す?
追加された 著者 Glenn,
postgresql.org/docs/8.1/static/plpgsql-cursors.html にはいくつかの例があります。あなたが探しているものではないかもしれませんが、それは可能なテクニックです。
追加された 著者 Glenn,

1 答え

いくつかの選択肢があります。最初は、呼び出し時にキャストされるポリモーフィック型を使用し、2番目はキャストを使用し、3番目はrefcursorを返すことです。

多態型

この場合、あなたは次のようなことをします:

 CREATE FUNCTION foo (bar varchar, baz ANYELEMENT) returns ANYELEMENT AS
 $$
   SELECT 'test'::TEXT;
 $$ language sql;

それから、コール時にNULL引数をキャストします:

SELECT * FROM foo('test', null::varchar);

これで本当に問題になるのは、すべての呼び出しで型を指定する必要があるということです。

キャスト付きの単一のリターンタイプ

あなたの例では、あるタイプは別のタイプのフィールドのサブセットを持っています。だからあなたは:

CREATE TYPE all_info AS (
   name text,
   email text,
   address text,
   phone text
);
CREATE TYPE email_only AS (
   name text,
   email text
);
CREATE FUNCTION email_only(all_info) returns email_only LANGUAGE SQL IMMUTABLE AS $$
SELECT $1.name, $1.email;
$$;
CREATE CAST (all_info as email_only) WITH FUNCTION email_only(all_info);

次に、all_infoを返す関数を作成し、出力にキャストすることができます。何かのようなもの:

SELECT (f::email_only).* FROM my_function('foo') f;

これらの2つは、refcursorsが使用しないSQL言語関数を使用できることに注意してください。

Refcursor

この場合、plpgsqlを使用する必要があります

CREATE OR REPLACE FUNCTION foo(bar varchar) RETURNS refcursor LANGUAGE plpgsql AS
$$
DECLARE a REFCURSOR;
BEGIN
   OPEN a FOR SELECT ....;
   RETURN a;
END;
$$;

一般的には、それは他のものよりもスーパーセットとキャストアプローチから始めるのが最も簡単だと思います。リフレクターはおそらく2番目のアプローチです。最後に、あるタイプのキャストを主張するだろう。

3
追加された