सैनिटाइज फंक्शन
आपके पास वर्तमान में जो कुछ भी है उसे सरलीकृत/स्वच्छतापूर्वक निम्न के लिए किया जा सकता है:
CREATE OR REPLACE FUNCTION func_a (username text = '', databaseobject text = '')
RETURNS ????
LANGUAGE plpgsql AS
$func$
BEGIN
RETURN QUERY EXECUTE
format ('SELECT * FROM %s v1 LEFT JOIN %I v2 USING (id)'
, CASE WHEN username = '*' THEN 'view1' ELSE 'view3' END
, databaseobject);
END
$func$;
आपको केवल BEGIN ... END
. के अतिरिक्त उदाहरणों की आवश्यकता है फ़ंक्शन बॉडी में अपने स्वयं के दायरे के साथ अलग कोड ब्लॉक शुरू करने के लिए, जिसकी शायद ही कभी आवश्यकता होती है।
मानक SQL संयोजन ऑपरेटर ||
. है . +
आपके पूर्व विक्रेता का "रचनात्मक" जोड़ है।
CaMeL- केस आइडेंटिफ़ायर का उपयोग न करें जब तक कि आप उन्हें डबल-कोट नहीं करते। सबसे अच्छा उनका बिल्कुल भी उपयोग न करें देखें:
- क्या PostgreSQL कॉलम नाम केस-संवेदी हैं?
varchar(4000)
SQL सर्वर की एक विशिष्ट सीमा के अनुरूप भी है। Postgres में इसका कोई विशेष महत्व नहीं है। केवल varchar(4000)
का उपयोग करें अगर आपको वास्तव में 4000 वर्णों की सीमा की आवश्यकता है। मैं केवल text
का उपयोग करूंगा - सिवाय इसके कि हमें किसी भी चर की आवश्यकता नहीं है बिल्कुल यहाँ, फ़ंक्शन को सरल बनाने के बाद।
यदि आपने format()
का उपयोग नहीं किया है , फिर भी, यहां मैनुअल देखें।
वापसी का प्रकार
अब, आपके वास्तविक प्रश्न के लिए:डायनेमिक क्वेरी के लिए रिटर्न प्रकार मुश्किल हो सकता है क्योंकि SQL को नवीनतम कॉल समय पर घोषित करने की आवश्यकता होती है। यदि आपके डेटाबेस में पहले से ही कॉलम परिभाषा सूची से मेल खाने वाली तालिका या दृश्य या समग्र प्रकार है, तो आप इसका उपयोग कर सकते हैं:
CREATE FUNCTION foo()
RETURNS SETOF my_view AS
...
अन्यथा, कॉलम परिभाषा सूची को (सबसे सरल) RETURNS TABLE
के साथ वर्तनी दें :
CREATE FUNCTION foo()
RETURNS TABLE (col1 int, col2 text, ...) AS
...
यदि आप जाते ही पंक्ति टाइप कर रहे हैं, तो आप अनाम रिकॉर्ड वापस कर सकते हैं:
CREATE FUNCTION foo()
RETURNS SETOF record AS
...
लेकिन फिर आपको प्रत्येक कॉल के साथ एक कॉलम परिभाषा सूची प्रदान करनी होगी, इसलिए मैं शायद ही कभी इसका उपयोग करता हूं।
मैं SELECT *
. का उपयोग नहीं करूंगा शुरुआत के लिए। लौटने के लिए कॉलम की एक निश्चित सूची का उपयोग करें और तदनुसार अपना रिटर्न प्रकार घोषित करें:
CREATE OR REPLACE FUNCTION func_a(username text = '', databaseobject text = '')
RETURNS TABLE(col1 int, col2 text, col3 date)
LANGUAGE plpgsql AS
$func$
BEGIN
RETURN QUERY EXECUTE
format ($f$SELECT v1.col1, v1.col2, v2.col3
FROM %s v1 LEFT JOIN %I v2 USING (id)$f$
, CASE WHEN username = '*' THEN 'view1' ELSE 'view3' END
, databaseobject);
END
$func$;
पूरी तरह से गतिशील प्रश्नों के लिए, किसी फ़ंक्शन का उपयोग करने के बजाय, प्रारंभ में अपने क्लाइंट में क्वेरी बनाने पर विचार करें।
आपको पहले मूल बातें समझनी होंगी:
- एक PL/pgSQL फ़ंक्शन को रिफ़ैक्टर करें ताकि विभिन्न SELECT क्वेरीज़ का आउटपुट लौटाया जा सके पोस्टग्रेज मैनुअल में
- PL/pgSQL
फिर पॉलीमॉर्फिक प्रकारों के साथ और अधिक उन्नत विकल्प हैं, जो आपको कॉल समय पर रिटर्न प्रकार पास करने की अनुमति देते हैं। के अंतिम अध्याय में अधिक:
- एक PL/pgSQL फ़ंक्शन को रिफ़ैक्टर करें ताकि विभिन्न SELECT क्वेरीज़ का आउटपुट लौटाया जा सके