आप SETOF
. को वापस करने के लिए सिंटैक्स मिला रहे हैं एकल पंक्ति या मान वापस करने के लिए सिंटैक्स वाले मान।
-- एक संबंधित प्रश्न है - मैं
. से एकल रिकॉर्ड 'r' कैसे लौटाऊं?
जब आप RETURNS TABLE
. के साथ कोई फंक्शन घोषित करते हैं , आपको RETURN NEXT
. का उपयोग करना होगा शरीर में एक पंक्ति (या अदिश मान) वापस करने के लिए। और अगर आप एक record
. का उपयोग करना चाहते हैं चर के साथ इसका मिलान होना चाहिए वापसी प्रकार। कोड उदाहरणों को और नीचे देखें।
एकल मान या पंक्ति लौटाएं
यदि आप केवल एक पंक्ति वापस करना चाहते हैं, तो कोई ज़रूरत नहीं . है अपरिभाषित प्रकार के रिकॉर्ड के लिए। @ केविन ने पहले ही दो तरीकों का प्रदर्शन किया है। मैं OUT
. के साथ एक सरलीकृत संस्करण जोड़ूंगा पैरामीटर:
CREATE OR REPLACE FUNCTION my_func(OUT a integer, OUT b text)
AS
$func$
BEGIN
a := ...;
b := ...;
END
$func$ LANGUAGE plpgsql;
आपको RETURN;
. जोड़ने की भी आवश्यकता नहीं है फ़ंक्शन बॉडी में, घोषित OUT
. का मान फ़ंक्शन के अंत में पैरामीटर स्वचालित रूप से वापस आ जाएंगे - NULL
किसी भी पैरामीटर के लिए जिसे असाइन नहीं किया गया है।
और आपको RETURNS RECORD
घोषित करने की आवश्यकता नहीं है क्योंकि यह OUT
. से पहले से ही स्पष्ट है पैरामीटर।
पंक्तियों का एक सेट लौटाएं
अगर आप वास्तव में एकाधिक वापस करना चाहते हैं पंक्तियाँ (0 या 1 पंक्ति की संभावना सहित), आप वापसी प्रकार को RETURNS
के रूप में परिभाषित कर सकते हैं ...
-
SETOF some_type
, जहांsome_type
कोई भी पंजीकृत अदिश या मिश्रित प्रकार हो सकता है। -
TABLE (col1 type1, col2 type2)
- एक तदर्थ पंक्ति प्रकार परिभाषा। -
SETOF record
प्लसOUT
कॉलम नामों और प्रकारों को परिभाषित करने के लिए पैरामीटर।
100%RETURNS TABLE
के बराबर । -
SETOF record
आगे परिभाषा के बिना। लेकिन फिर लौटाई गई पंक्तियाँ अपरिभाषित हैं और आपको प्रत्येक कॉल के साथ एक कॉलम परिभाषा सूची शामिल करनी होगी (उदाहरण देखें)।
रिकॉर्ड प्रकार के बारे में मैनुअल:
<ब्लॉकक्वॉट>रिकॉर्ड चर पंक्ति-प्रकार के चर के समान होते हैं, लेकिन उनकी कोई पूर्वनिर्धारित संरचना नहीं होती है। वे उस पंक्ति की वास्तविक पंक्ति संरचना को अपनाते हैं जो उन्हें SELECT या FOR कमांड के दौरान सौंपी जाती है।
और भी बहुत कुछ है, पढ़ें मैनुअल।
आप कर सकते हैं एक परिभाषित प्रकार निर्दिष्ट किए बिना एक रिकॉर्ड चर का उपयोग करें, आप कर सकते हैं ऐसे अपरिभाषित रिकॉर्ड भी लौटाएं:
CREATE OR REPLACE FUNCTION my_func()
RETURNS SETOF record AS
$func$
DECLARE
r record;
BEGIN
r := (1::int, 'foo'::text); RETURN NEXT r; -- works with undefined record
r := (2::int, 'bar'::text); RETURN NEXT r;
END
$func$ LANGUAGE plpgsql;
कॉल करें:
SELECT * FROM my_func() AS x(a int, b text);
लेकिन यह बहुत बोझिल है जैसा कि आपको प्रत्येक कॉल के साथ कॉलम परिभाषा सूची प्रदान करनी है। इसे आम तौर पर कुछ अधिक सुंदर से बदला जा सकता है:
- यदि आप फ़ंक्शन निर्माण के समय प्रकार जानते हैं, तो इसे तुरंत घोषित करें (
RETURNS TABLE
या दोस्त)।
CREATE OR REPLACE FUNCTION my_func()
RETURNS SETOF tbl_or_type AS
$func$
DECLARE
r tbl_or_type;
BEGIN
SELECT INTO tbl_or_type * FROM tbl WHERE id = 10;
RETURN NEXT r; -- type matches
SELECT INTO tbl_or_type * FROM tbl WHERE id = 12;
RETURN NEXT r;
-- Or simpler:
RETURN QUERY
SELECT * FROM tbl WHERE id = 14;
END
$func$ LANGUAGE plpgsql;
- यदि आप प्रकार जानते हैं फ़ंक्शन कॉल के समय , पॉलीमॉर्फिक प्रकारों का उपयोग करने के अधिक सुरुचिपूर्ण तरीके हैं:
विभिन्न SELECT क्वेरी के आउटपुट को वापस करने के लिए PL/pgSQL फ़ंक्शन को रिफैक्टर करें
आपका प्रश्न स्पष्ट नहीं है कि आपको वास्तव में क्या चाहिए।