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

PL/pgSQL फ़ंक्शन में वैकल्पिक तर्क

चूंकि PostgreSQL 8.4 (जो आपको लगता है कि चल रहा है), फ़ंक्शन पैरामीटर के लिए डिफ़ॉल्ट मान . हैं . यदि आप अपना पैरामीटर अंतिम रखते हैं और एक डिफ़ॉल्ट प्रदान करते हैं, तो आप इसे कॉल से आसानी से हटा सकते हैं:

CREATE OR REPLACE FUNCTION foofunc(_param1 integer
                                 , _param2 date
                                 , _ids    int[] DEFAULT '{}')
  RETURNS SETOF foobar         -- declare return type!
  LANGUAGE plpgsql AS
$func$
BEGIN  -- required for plpgsql
   IF _ids <> '{}'::int[] THEN  -- exclude empty array and NULL
      RETURN QUERY
      SELECT *
      FROM   foobar
      WHERE  f1 = _param1
      AND    f2 = _param2
      AND    id = ANY(_ids);    -- "IN" is not proper syntax for arrays
   ELSE
      RETURN QUERY
      SELECT *
      FROM   foobar
      WHERE  f1 = _param1
      AND    f2 = _param2;
   END IF;
END  -- required for plpgsql
$func$;

प्रमुख बिंदु:

  • कीवर्ड DEFAULT पैरामीटर डिफ़ॉल्ट घोषित करने के लिए प्रयोग किया जाता है। संक्षिप्त विकल्प:=

  • मैंने अनावश्यक param1 . को हटा दिया गन्दा उदाहरण से।

  • चूंकि आप SELECT * FROM foobar return लौटते हैं , वापसी प्रकार को RETURNS SETOF foobar . के रूप में घोषित करें RETURNS SETOF record . के बजाय . अनाम रिकॉर्ड के साथ बाद वाला फॉर्म बहुत बोझिल है, आपको प्रत्येक कॉल के साथ एक कॉलम परिभाषा सूची प्रदान करनी होगी।

  • मैं पूर्णांक की एक सरणी का उपयोग करता हूं (int[] ) फ़ंक्शन पैरामीटर के रूप में। IF को अनुकूलित किया एक्सप्रेशन और WHERE तदनुसार खंड।

  • IF सादे एसक्यूएल में बयान उपलब्ध नहीं हैं। LANGUAGE plpgsql होना चाहिए उसके लिए।

_ids के साथ या बिना कॉल करें :

SELECT * FROM foofunc(1, '2012-1-1'::date);

प्रभावी रूप से वही:

SELECT * FROM foofunc(1, '2012-1-1'::date, '{}'::int[]);

आपको यह सुनिश्चित करना होगा कि कॉल स्पष्ट है। यदि आपके पास एक ही नाम और दो मापदंडों का एक और कार्य है, तो पोस्टग्रेज को यह नहीं पता हो सकता है कि किसे चुनना है। स्पष्ट कास्टिंग (जैसे मैं प्रदर्शित करता हूं) इसे कम करता है। अन्यथा, टाइप न किए गए स्ट्रिंग अक्षर भी काम करते हैं, लेकिन स्पष्ट होने से कभी दर्द नहीं होता है।

किसी अन्य फ़ंक्शन के भीतर से कॉल करें:

CREATE FUNCTION foofuncwrapper(_param1 integer, _param2 date)
  RETURNS SETOF foobar
  LANGUAGE plgpsql AS
$func$
DECLARE
   _ids int[] := '{1,2,3}';
BEGIN
   -- whatever

   RETURN QUERY
   SELECT * FROM foofunc(_param1, _param2, _ids);
END
$func$;


  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 9.3:डायनेमिक पिवट टेबल

  2. postgresql में बनाई गई किसी भी नई तालिका के लिए उपयोगकर्ता को अनुमति दें

  3. PostgreSQL में डेटाबेस की एक कॉपी बनाना

  4. PostgreSQL UNIX डोमेन सॉकेट बनाम TCP सॉकेट

  5. पोस्टग्रेज में एक जेसन सरणी को पंक्तियों में कैसे बदलें