2009-04-16 25 views

उत्तर

-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) 

आप निश्चित रूप से एक मौजूदा तालिका/दृश्य या लौटे प्रकार के लिए एक कस्टम प्रकार का उपयोग कर सकते हैं।

उदाहरण भाषा का प्रयोग एसक्यूएल:

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

आप केवल 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. refcursors का उपयोग कर :)

+2

इसे मेरी टेबल पर फ़िट करना मुझे मिलता है: 'चुनें [* से] "pr_GetCustomersAndOrders"(); pr_GetCustomersAndOrders -------------------------- <अज्ञात पोर्टल 11> <अज्ञात पोर्टल 12> ' psql 9.1 का उपयोग करना। – valid

+2

यहां भी – llouk

3
हैं first_table

और second_table एक ही लेआउट, आप भी बस का उपयोग कर सकते है

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

[संपादित करें: एक टिप्पणीकार (जिसका नाम शायद "अशक्त" नहीं है :)) के लिए धन्यवाद के लिए (लंबी टी से पहले उनका कहना है कि UNION ALLUNION से तेज है।]

+3

नाइटपिकिंग, लेकिन यूनियन सभी तेज होंगे (कोई "| sort | uniq" नहीं है), लेकिन अगर कोई है तो डुप्लिकेट वापस कर देगा। – tommym

+1

@ शून्य: अच्छा बिंदु; अपडेट किया गया। (मुझे लगता है कि आपका नाम शायद "शून्य" नहीं है - ऐसा लगता है कि हाल ही में बहुत कुछ बग इसका कारण बनता है। मैं अपने प्रोफाइल पेज पर शीर्ष फ़ील्ड को संपादित करके इसे ठीक करने में सक्षम था।) –

+3

हां लेकिन वापस आने वाले प्रश्नों के बारे में क्या है वही लेआउट? अगर हमें कई सेट प्राप्त करने की ज़रूरत है तो यह काफी सीमित है। मैं SQL सर्वर में संग्रहित प्रक्रिया का उपयोग करता हूं जो 10+ परिणाम सेट देता है। 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

@UdeetSolanki: किसी फ़ंक्शन से प्रत्यक्ष परिणाम के रूप में संभव नहीं है। इसके चारों ओर विभिन्न तरीके हैं: कर्सर, अस्थायी तालिकाओं, दस्तावेज़ प्रकार जैसे 'json'। मेरा सुझाव है कि आप एक नया सवाल पूछें, टिप्पणियां जगह नहीं हैं। –

संबंधित मुद्दे