2009-04-16 11 views

Antwort

-1

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) 

See here for doc

+2

Sie verwenden nur 1 Tabelle, die Tabelle "Kunde". Die Frage betrifft mehrere Ergebnismengen! – 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. mit refcursors :)

+2

Passend zu meinen Tabellen bekomme ich: 'SELECT [* FROM]" pr_GetCustomersAndOrders "(); pr_GetCustomersAndOrders -------------------------- ' Verwenden von psql 9.1. – valid

+2

Gleiches hier auch – llouk

3

Wenn first_table und second_table haben das gleiche Layout, können Sie auch nur

verwenden
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.]

+3

Nitpicking, aber UNION ALL wäre schneller (es gibt keine "| sort | uniq"), aber wird Duplikate zurückgeben, wenn es welche gibt. – tommym

+1

@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.) –

+3

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

13

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.

+1

was für verschiedene Zeilentypen? Gibt es eine Lösung? anders als der Cursor. Ich suche nach zwei Recordsets bei einem Anruf. –

+1

@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. –

Verwandte Themen