PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PL/pgSQL में रिकॉर्ड की टपल संरचना की घोषणा

आप 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 फ़ंक्शन को रिफैक्टर करें

आपका प्रश्न स्पष्ट नहीं है कि आपको वास्तव में क्या चाहिए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL को केवल मेमोरी में चलाना

  2. Postgres '\connect कमांड का JDBC प्रतिरूप क्या है?

  3. स्व-हस्ताक्षरित प्रमाणपत्रों के साथ जंग में PostgreSQL SSL कनेक्शन का उपयोग करें

  4. ClusterControl CLI का उपयोग करके PostgreSQL और TimescaleDB बैकअप बहाली

  5. मैं PostgreSQL का कौन सा संस्करण चला रहा हूँ?