पॉलीमॉर्फिक परिणाम वापस करने के लिए क्रिएट टाइप का उपयोग न करें। इसके बजाय 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 में सबसे अच्छे और सबसे कम उपयोग की जाने वाली सुविधाओं में से एक है। कृपया प्रचार करें।