चूंकि 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$;