Ist es möglich, mehrere Ergebnismengen aus einer Postgres-Funktion, wie in MSSQL zurückzukehren:PostgreSQL-Funktion mehrere Ergebnis Rückkehr setzt
CREATE PROCEDURE test
AS
SELECT * FROM first_table
SELECT * FROM second_table
Ist es möglich, mehrere Ergebnismengen aus einer Postgres-Funktion, wie in MSSQL zurückzukehren:PostgreSQL-Funktion mehrere Ergebnis Rückkehr setzt
CREATE PROCEDURE test
AS
SELECT * FROM first_table
SELECT * FROM second_table
Ja.
Beispiel:
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)
Sie können natürlich eine vorhandene Tabelle/Ansicht oder einen benutzerdefinierten Typ für den zurückgegebenen Typ verwenden.
Beispiel unter Verwendung von Sprache 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. mit refcursors :)
Wenn first_table
und second_table
haben das gleiche Layout, können Sie auch nur
SELECT * FROM first_table WHERE ...
UNION ALL
SELECT * FROM second_table WHERE ...
[EDIT: Dank eines Kommentator (dessen Name ist wahrscheinlich nicht "null" :)) für Hinweis darauf, dass UNION ALL
schneller als UNION
ist.]
Nitpicking, aber UNION ALL wäre schneller (es gibt keine "| sort | uniq"), aber wird Duplikate zurückgeben, wenn es welche gibt. – tommym
@null: Guter Punkt; aktualisiert. (Ich weiß, dass Ihr Name wahrscheinlich nicht "null" ist - ein neuerer SO-Fehler scheint das zu verursachen. Ich konnte ihn beheben, indem ich das oberste Feld auf meiner Profilseite bearbeite.) –
Ja, aber was ist mit Abfragen, die nicht zurückkommen die gleichen Layouts? Es ist ziemlich einschränkend, wenn wir viele Sets bekommen müssen. Ich verwende Stored Procedure in SQL Server, die mehr als 10 Ergebnismengen zurückgibt. So etwas in PostgreSQL? – MaxiWheat
A einfacher Weise um seit PostgreSQL 8.3 ist (lange vor t seine Frage wurde gefragt):
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;
Call:
SELECT * FROM test();
die manual on RETURN QUERY See.
was für verschiedene Zeilentypen? Gibt es eine Lösung? anders als der Cursor. Ich suche nach zwei Recordsets bei einem Anruf. –
@UdeetSolanki: Nicht möglich als direktes Ergebnis einer Funktion. Es gibt verschiedene Möglichkeiten: mit Cursors, temporären Tabellen, Dokumenttypen wie 'json'. Ich schlage vor, Sie stellen eine neue Frage, Kommentare sind nicht der richtige Ort. –
Sie verwenden nur 1 Tabelle, die Tabelle "Kunde". Die Frage betrifft mehrere Ergebnismengen! – llouk