उन्नत सुविधाएं जैसे VARIADIC
या यहां तक कि बहुरूपी इनपुट प्रकार और गतिशील SQL बहुत शक्तिशाली हैं। इस उत्तर का अंतिम अध्याय एक उन्नत उदाहरण प्रदान करता है:
- एक PL/pgSQL फ़ंक्शन को रिफ़ैक्टर करें ताकि विभिन्न SELECT क्वेरीज़ का आउटपुट लौटाया जा सके
लेकिन आपके जैसे साधारण मामले के लिए, आप केवल डिफ़ॉल्ट मान . का उपयोग कर सकते हैं फ़ंक्शन मापदंडों के लिए। यह सब सटीक आवश्यकताओं पर निर्भर करता है।
यदि विचाराधीन कॉलम सभी परिभाषित हैं NOT NULL
, यह शायद आसान और तेज़ होगा:
CREATE OR REPLACE FUNCTION update_site(_name text -- always required
, _city text DEFAULT NULL
, _telephone integer DEFAULT NULL)
RETURNS integer AS
$func$
BEGIN
IF _city IS NULL AND _telephone IS NULL THEN
RAISE WARNING 'At least one value to update required!';
RETURN; -- nothing to update
END IF;
UPDATE "Sites"
SET "City" = COALESCE(_city, "City")
, "Telephone" = COALESCE(_telephone, "Telephone")
WHERE "SiteName" = _name;
END
$func$ LANGUAGE plpgsql;
मैनुअल में डिफ़ॉल्ट मानों के बारे में पढ़ें!
पैरामीटर और कॉलम नामों के बीच नामकरण संघर्ष से बचने के लिए मैं इसे _
. के साथ इनपुट पैरामीटर उपसर्ग करने की आदत बना देता हूं . यह स्वाद और शैली की बात है।
- पहला पैरामीटर
name
कोई डिफ़ॉल्ट नहीं है, क्योंकि यह हर समय आवश्यक है। - अन्य मापदंडों को छोड़ा जा सकता है।
- कम से कम एक की आवश्यकता है, या एक
WARNING
उठाया जाता है और कुछ नहीं होता है। UPDATE
केवल दिए गए पैरामीटर के लिए कॉलम बदलेगा।- आसानी से N . के लिए विस्तारित किया जा सकता है पैरामीटर।
फ़ंक्शन कॉल
चूंकि पोस्टग्रेज 9.5 :
आसान तरीका है स्थितीय संकेतन . के साथ मापदंडों के लिए। यह केवल सबसे सही पैरामीटर को छोड़ने की अनुमति देता है:
SELECT update_site('foo', 'New York'); -- no telephone
नामित संकेतन कोई भी छोड़ने की अनुमति देता है पैरामीटर जिसका डिफ़ॉल्ट मान है:
SELECT update_site(name => 'foo', _telephone => 123); -- no city
दोनों को मिश्रित नोटेशन . में जोड़ा जा सकता है :
SELECT update_site('foo', _telephone => 123); -- still no city
पोस्टग्रेज 9.4 . में या पुराने, :=
कॉल में असाइनमेंट के लिए इस्तेमाल किया गया था:
SELECT update_site(name := 'foo', _telephone := 123);
SELECT update_site('foo', _telephone := 123);
पश्चगामी संगतता के लिए Postgres 12 में अभी भी मान्य है, बल्कि आधुनिक संकेतन का उपयोग करें।