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

PL/pgSQL के साथ PostgreSQL में रिकॉर्ड के रूप में एकाधिक फ़ील्ड लौटाएं

पॉलीमॉर्फिक परिणाम वापस करने के लिए क्रिएट टाइप का उपयोग न करें। इसके बजाय RECORD प्रकार का उपयोग करें और उसका दुरुपयोग करें। इसे देखें:

CREATE FUNCTION test_ret(a TEXT, b TEXT) RETURNS RECORD AS $$
DECLARE 
  ret RECORD;
BEGIN
  -- Arbitrary expression to change the first parameter
  IF LENGTH(a) < LENGTH(b) THEN
      SELECT TRUE, a || b, 'a shorter than b' INTO ret;
  ELSE
      SELECT FALSE, b || a INTO ret;
  END IF;
RETURN ret;
END;$$ LANGUAGE plpgsql;

इस तथ्य पर ध्यान दें कि यह वैकल्पिक रूप से दो return लौटा सकता है या तीन इनपुट के आधार पर कॉलम।

test=> SELECT test_ret('foo','barbaz');
             test_ret             
----------------------------------
 (t,foobarbaz,"a shorter than b")
(1 row)

test=> SELECT test_ret('barbaz','foo');
             test_ret             
----------------------------------
 (f,foobarbaz)
(1 row)

यह कोड पर कहर बरपाता है, इसलिए लगातार कॉलम का उपयोग करें, लेकिन ऑपरेशन की सफलता को वापस करने वाले पहले पैरामीटर के साथ वैकल्पिक त्रुटि संदेशों को वापस करने के लिए यह हास्यास्पद रूप से आसान है। लगातार स्तंभों का उपयोग करके पुनर्लेखन:

CREATE FUNCTION test_ret(a TEXT, b TEXT) RETURNS RECORD AS $$
DECLARE 
  ret RECORD;
BEGIN
  -- Note the CASTING being done for the 2nd and 3rd elements of the RECORD
  IF LENGTH(a) < LENGTH(b) THEN
      ret := (TRUE, (a || b)::TEXT, 'a shorter than b'::TEXT);
  ELSE
      ret := (FALSE, (b || a)::TEXT, NULL::TEXT);
   END IF;
RETURN ret;
END;$$ LANGUAGE plpgsql;

लगभग महाकाव्य हॉटनेस के लिए:

test=> SELECT test_ret('foobar','bar');
   test_ret    
----------------
 (f,barfoobar,)
(1 row)

test=> SELECT test_ret('foo','barbaz');
             test_ret             
----------------------------------
 (t,foobarbaz,"a shorter than b")
(1 row)

लेकिन आप इसे कई पंक्तियों में कैसे विभाजित करते हैं ताकि आपकी पसंद की ओआरएम परत मूल्यों को आपकी पसंद के मूल डेटा प्रकारों की भाषा में परिवर्तित कर सके? हॉटनेस:

test=> SELECT a, b, c FROM test_ret('foo','barbaz') AS (a BOOL, b TEXT, c TEXT);
 a |     b     |        c         
---+-----------+------------------
 t | foobarbaz | a shorter than b
(1 row)

test=> SELECT a, b, c FROM test_ret('foobar','bar') AS (a BOOL, b TEXT, c TEXT);
 a |     b     | c 
---+-----------+---
 f | barfoobar | 
(1 row)

यह PostgreSQL में सबसे अच्छे और सबसे कम उपयोग की जाने वाली सुविधाओं में से एक है। कृपया प्रचार करें।



  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 में मॉड्यूल कैसे आयात करूं या एक्सटेंशन कैसे स्थापित करूं?

  3. PostgreSQL सरणी को PHP सरणी में बदलें

  4. बल्क अपडेट और डिलीट ऑपरेशन करते समय PostgreSQL गतिरोध से बचना

  5. प्राग पोस्टग्रेएसक्यूएल मीटअप