आप कर सकते थे समग्र पंक्ति को समग्र प्रकार के रूप में लौटाएं और कुछ और जोड़ें:
CREATE OR REPLACE FUNCTION f_rowplus()
RETURNS TABLE (rec demo, add_int int, add_txt text) AS
$func$
SELECT d, 5, 'baz'::text FROM demo d;
$func$ LANGUAGE sql;
लेकिन तब, जब आप साधारण कॉल का उपयोग करते हैं:
SELECT * FROM f_rowplus();
आपको तालिका demo
. से पंक्ति मिलती है अलग समग्र प्रकार के रूप में। आपको कॉल करना होगा:
SELECT (rec).*, add_int, add_txt FROM f_rowplus();
सभी व्यक्तिगत . प्राप्त करने के लिए स्तंभ। कोष्ठक आवश्यक हैं।
पोस्टग्रेज यहां थोड़ा असंगत है। यदि आप इसके साथ कोई फ़ंक्शन बनाते हैं:
CREATE OR REPLACE FUNCTION f_row2()
RETURNS TABLE (rec demo) AS
...
फिर समग्र प्रकार demo
चुपचाप अलग-अलग कॉलम (विघटित) में परिवर्तित हो जाता है। मूल मिश्रित प्रकार का कोई लिंक नहीं रहता है। आप घोषित आउटपुट कॉलम का संदर्भ नहीं दे सकते rec
बिल्कुल, चूंकि इसे विघटित प्रकार के स्तंभों से बदल दिया गया है। इस कॉल के परिणामस्वरूप एक त्रुटि संदेश आएगा:
SELECT rec FROM f_row2();
यहाँ वही:
CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
RETURNS SETOF demo AS
...
हालांकि , जैसे ही आप कोई भी . जोड़ते हैं अधिक OUT
कॉलम, समग्र प्रकार घोषित (विघटित नहीं) के रूप में संरक्षित है और आप यह कर सकते हैं:
SELECT rec FROM f_rowplus();
पहले समारोह के साथ।
मैंने एक SQL Fiddle बनाया है रूपों का प्रदर्शन।
एक तरफ
किसी फ़ंक्शन का उपयोग करते समय FROM
. में एकाधिक कॉलम लौटाते हैं सूची (टेबल फ़ंक्शन के रूप में) और SELECT
. में विघटित करना इस तरह की सूची:
SELECT (rec).* FROM f_rowplus();
... फ़ंक्शन का अभी भी मूल्यांकन किया जाता है एक बार केवल - कॉल करते समय और SELECT
. में डीकंपोज़िंग सीधे इस तरह सूची बनाएं:
SELECT (f_rowplus()).*; -- also: different result
... हर कॉलम के लिए एक बार का मूल्यांकन करेगा वापसी प्रकार में। विवरण: