を設定し、MSSQLのように、Postgresの関数から複数の結果セットを返すことが可能です:PostgreSQLの機能は
CREATE PROCEDURE test
AS
SELECT * FROM first_table
SELECT * FROM second_table
を設定し、MSSQLのように、Postgresの関数から複数の結果セットを返すことが可能です:PostgreSQLの機能は
CREATE PROCEDURE test
AS
SELECT * FROM first_table
SELECT * FROM second_table
はい。
例:
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)
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_table
とsecond_table
は同じレイアウトを持っている場合refcursors :)
を使用して、あなたはまた、単に
SELECT * FROM first_table WHERE ...
UNION ALL
SELECT * FROM second_table WHERE ...
[EDITを使用することができますUNION ALL
がUNION
よりも高速であることを指摘。]
Nitpickingですが、UNION ALLはもっと速くなります( "| sort | uniq"はありません)がある場合は重複を返します。 – tommym
@ null:良い点。更新しました。 (あなたの名前はおそらく "null"ではないことに気づいています - 最近のSOのバグが原因です)プロファイルページのトップフィールドを編集して修正できました。 –
はい、返されないクエリ同じレイアウト?多くのセットを取得する必要がある場合は非常に制限的です。私は10以上の結果セットを返すSQL Serverのストアドプロシージャを使用します。 PostgreSQLのようなものは何ですか? – MaxiWheat
単純方法は、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つの呼び出しで2つのレコードセットを取得しようとしています。 –
@UdeetSolanki:関数の直接の結果としては不可能です。その周りにはさまざまな方法があります:カーソル、一時テーブル、 'json'のようなドキュメントタイプです。私はあなたが新しい質問をすることをお勧めします、コメントは場所ではありません。 –
テーブル「customer」は1つのテーブルのみを使用します。質問は複数の結果セットについてです! – llouk