plpgsql फ़ंक्शन में कुछ भी गलत नहीं है कुछ और जटिल के लिए। एकमात्र स्थिति जहां प्रदर्शन को नुकसान हो सकता है, जब एक plpgsql फ़ंक्शन नेस्टेड होता है, क्योंकि क्वेरी प्लानर बाहरी क्वेरी के संदर्भ में निहित कोड को और अधिक अनुकूलित नहीं कर सकता है जो इसे धीमा कर सकता है या नहीं।
इसमें अधिक विवरण बाद में उत्तर:
- PostgreSQL फ़ंक्शंस में भाषा sql और भाषा plpgsql के बीच अंतर
मामले में बहुत सारे CASE
. की तुलना में बहुत आसान है एक प्रश्न में खंड:
CREATE OR REPLACE FUNCTION get_stuff(_param text, _orderby text, _limit int)
RETURNS SETOF stuff AS
$func$
BEGIN
RETURN QUERY EXECUTE '
SELECT *
FROM stuff
WHERE col = $1
ORDER BY ' || quote_ident(_orderby) || ' ASC
LIMIT $2'
USING _param, _limit;
END
$func$ LANGUAGE plpgsql;
कॉल करें:
SELECT * FROM get_stuff('hello', 'col2', 100);
नोट
RETURN QUERY EXECUTE
. का उपयोग करें एक बार में क्वेरी के परिणाम वापस करने के लिए।
quote_ident()
Use का इस्तेमाल करें पहचानकर्ताओं के लिए SQLi से सुरक्षा के लिए।
या format()
कुछ और जटिल के लिए। देखें:
- तालिका नाम PostgreSQL फ़ंक्शन पैरामीटर के रूप में
USING
. के साथ पैरामीटर मान पास करें एक बार फिर कास्टिंग, उद्धरण और SQLi से बचने के लिए क्लॉज।
सावधान रहें कि पैरामीटर और कॉलम नामों के बीच नामकरण विरोध न बनाएं। मैंने अंडरस्कोर (_
. के साथ पैरामीटर नाम प्रीफ़िक्स किया है ) उदाहरण में। बस मेरी निजी पसंद।
संपादन के बाद आपका दूसरा कार्य काम नहीं कर सकता, क्योंकि आप केवल parent
लौटाते हैं जबकि वापसी प्रकार घोषित किया जाता है SETOF stuff
. आप कोई भी . घोषित कर सकते हैं वापसी प्रकार आपको पसंद है, लेकिन वास्तविक वापसी मूल्यों को घोषणा से मेल खाना चाहिए। आप RETURNS TABLE
का उपयोग करना चाह सकते हैं उसके लिए।