2009-04-16 13 views
14

を設定し、MSSQLのように、Postgresの関数から複数の結果セットを返すことが可能です:PostgreSQLの機能は

CREATE PROCEDURE test 

AS 

SELECT * FROM first_table 

SELECT * FROM second_table 

答えて

-1

はい。

例:

test=# create function x() returns setof integer language plpgsql as $$ begin return next 1; return next 2; end $$; 
CREATE FUNCTION 
test=# select * from x(); 
x 
--- 
1 
2 
(2 rows) 

あなたはもちろん、既存のテーブル/ビューまたは返される型のカスタムタイプを使用することができます。言語SQLを使用して

例:

test=# create table customer (name varchar, birth_date date); 
CREATE TABLE 
test=# create function y() returns setof customer language sql as $$ 
select * from customer 
union all 
select * from customer 
$$; 
CREATE FUNCTION 
test=# insert into customer values ('joe', now()::date); 
INSERT 0 1 
test=# insert into customer values ('jill', now()::date); 
INSERT 0 1 
test=# select * from y(); 
name | birth_date 
------+------------ 
joe | 2009-04-16 
jill | 2009-04-16 
joe | 2009-04-16 
jill | 2009-04-16 
(4 rows) 

See here for doc

+2

テーブル「customer」は1つのテーブルのみを使用します。質問は複数の結果セットについてです! – llouk

7
CREATE OR REPLACE FUNCTION "pr_GetCustomersAndOrders"() 
RETURNS SETOF refcursor AS 
$BODY$DECLARE 
customerRC refcursor; 
orderRC refcursor; 
BEGIN 
open customerRC FOR 
SELECT * FROM customers; 
RETURN NEXT customerRC; 

open orderRC FOR 
SELECT * FROM orders; 
RETURN NEXT orderRC; 
RETURN; 
END;$BODY$ 
LANGUAGE 'plpgsql' VOLATILE; 
ALTER FUNCTION "pr_GetCustomersAndOrders"() OWNER TO postgres; 

I.o.w.以下のために(名前、おそらく「ヌル」ではありません:))コメント投稿に感謝:first_tablesecond_tableは同じレイアウトを持っている場合refcursors :)

+2

これを私のテーブルに当てはめると: 'SELECT [* FROM]" pr_GetCustomersAndOrders "(); pr_GetCustomersAndOrders -------------------------- <無名ポータル11> <無名ポータル12> psql 9.1の使用。 – valid

+2

同じです。 – llouk

3

を使用して、あなたはまた、単に

SELECT * FROM first_table WHERE ... 
UNION ALL 
SELECT * FROM second_table WHERE ... 

[EDITを使用することができますUNION ALLUNIONよりも高速であることを指摘。]

+3

Nitpickingですが、UNION ALLはもっと速くなります( "| sort | uniq"はありません)がある場合は重複を返します。 – tommym

+1

@ null:良い点。更新しました。 (あなたの名前はおそらく "null"ではないことに気づいています - 最近のSOのバグが原因です)プロファイルページのトップフィールドを編集して修正できました。 –

+3

はい、返されないクエリ同じレイアウト?多くのセットを取得する必要がある場合は非常に制限的です。私は10以上の結果セットを返すSQL Serverのストアドプロシージャを使用します。 PostgreSQLのようなものは何ですか? – MaxiWheat

13

単純方法は、PostgreSQL 8.3ので、周りをされている(長いトンの前に彼の質問を尋ねられた):!

CREATE FUNCTION test() 
    RETURNS SETOF first_table AS 
$func$ 
BEGIN 

RETURN QUERY 
SELECT * FROM first_table; 

RETURN QUERY 
SELECT * FROM second_table; -- has to return same rowtype as first_table! 

END 
$func$ LANGUAGE plpgsql; 

コール:

SELECT * FROM test(); 

manual on RETURN QUERYを参照してください。

+1

異なる行タイプはどうですか?解決策はありますか?カーソル以外。私は1つの呼び出しで2つのレコードセットを取得しようとしています。 –

+1

@UdeetSolanki:関数の直接の結果としては不可能です。その周りにはさまざまな方法があります:カーソル、一時テーブル、 'json'のようなドキュメントタイプです。私はあなたが新しい質問をすることをお勧めします、コメントは場所ではありません。 –

関連する問題