यह इस तरह काम कर सकता है:
CREATE OR REPLACE FUNCTION tt_query(orig_name regclass, data_tt timestamp)
RETURNS SETOF record AS
$func$
BEGIN
EXECUTE 'CREATE OR REPLACE TEMP VIEW tmp as
select *
from '
|| orig_name
|| ' where trigger_changed >'
|| quote_literal(data_tt)
|| ' ORDER BY trigger_changed DESC';
-- other work on view tmp
-- return the rows of view temp
RETURN QUERY
SELECT * FROM tmp;
END
$func$ LANGUAGE plpgsql;
-
ऑब्जेक्ट आइडेंटिफ़ायर प्रकार
regclass
स्वचालित रूप से SQL इंजेक्शन से बचने के लिए। -
पुराने सिंटैक्स का उपयोग न करें
var ALIAS for $1
अगर आपको नहीं करना है। इसके बजाय पैरामीटर नाम घोषित करें। -
मैं
temp
कीवर्ड का उपयोग नहीं करूंगा पहचानकर्ता के रूप में, भले ही इसकी अनुमति हो।tmp
का उपयोग करना इसके बजाय। -
रिटर्न क्वेरी
का उपयोग करें रिकॉर्ड का एक सेट वापस करने के लिए। यहEXECUTE
. के बिना भी एक स्थिर कॉल हो सकता है . हालांकि, आप गुमनाम रिकॉर्ड लौटा रहे हैं और पोस्टग्रेज़ एक कॉलम परिभाषा सूची की मांग करता है हर कॉल के साथ:
SELECT * FROM tt_query('tbl_name', '2014-02-15 12:00')
AS f(col1 int, col2 text, ...);
यह बल्कि बोझिल है।
बेहतर समाधान
अगर आप जानते हैं वापसी प्रकार (भले ही तालिका के नाम बदल रहे हों, स्तंभों की सूची समान प्रकार साझा कर सकती है), इसे निर्माण के समय घोषित करें। इस संबंधित प्रश्न पर विचार करें:
PostgreSQL:ERROR:42601:"रिकॉर्ड" लौटाने वाले फंक्शन के लिए एक कॉलम परिभाषा सूची की आवश्यकता होती है
यदि रिटर्न प्रकार भिन्न होता है प्रदान किए गए तालिका नाम के साथ, अभी भी एक बेहतर समाधान है। चूंकि आप सेलेक्ट * tbl से
. के साथ एक व्यू बना रहे हैं , आप तालिका के प्रसिद्ध प्रकार का उपयोग बहुरूपी
पैरामीटर:
CREATE OR REPLACE FUNCTION tt_query(orig_name anyelement, data_tt timestamp)
RETURNS SETOF anyelement AS
$func$
BEGIN
EXECUTE format('CREATE OR REPLACE TEMP VIEW tmp AS
SELECT * FROM %s
WHERE trigger_changed > %L
ORDER BY trigger_changed DESC'
,pg_typeof(orig_name)
,data_tt);
-- other work on view tmp
-- return the rows of view tmp
RETURN QUERY
SELECT * FROM tmp;
END
$func$ LANGUAGE plpgsql;
सरलीकृत कॉल:
SELECT * FROM tt_query(NULL::tbl_name, '2014-02-15 12:00');
साथ ही format()<का उपयोग करना /कोड>
सुरक्षित और सरल स्ट्रिंग संयोजन के लिए।
इस संबंधित उत्तर में अधिक विवरण:
विभिन्न SELECT क्वेरीज़ के आउटपुट को वापस करने के लिए PL/pgSQL फ़ंक्शन को रिफ़ैक्टर करें