2012-02-06 9 views
0

いくつかのPostgreSQL関数に任意の戻り値型を定義できますか?PostgreSQL関数が「任意の」型を返すことは可能ですか?

考えられるのは、呼び出しによっては出力が異なることがあります。

例えば、我々が持っているとしましょう:

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

我々は機能を有していてもよい:

func1(name varchar); 

しかし、戻り値の型は、いずれかである:TypeAまたはTypeB

だから、それはありますfunc1を定義することができるので、任意の戻り値の型は機能しますか?

EDIT:ソリューションはREFCURSORある

たら...誰かが私の質問の例に基づいて回答を記入してくださいもらえますか?それはたくさんの助けになります!

+0

refcursorを返しますか? – Glenn

+0

グレン、ありがとう、しかし、あなたは小さな例を挙げてください。それはすごく助けになるでしょう。 – Larry

+2

http://www.postgresql.org/docs/8.1/static/plpgsql-cursors.htmlにはいくつかの例があります。あなたが探しているものではないかもしれませんが、それは可能なテクニックです。 – Glenn

答えて

1

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

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

:あなたが呼び出しにNULL引数を投じるそれを呼び出すためにその後

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

この場合、ポリモーフィック型の

、あなたのような何かをしたいですこれで本当に問題になるのは、すべての呼び出しで型を指定する必要があるということです。あなたの例では、キャスト

シングル戻り値の型は、一つのタイプは、別の型のフィールドのサブセットを持っています。だから、可能性:

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; 

注これら二つは、あなたがrefcursorsがいないSQL言語の機能を使用できるようにします。あなたは一般的に

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

plpgsqlが使用する必要があります。この場合はREFCURSOR

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

関連する問題