तैयार
आपके सूत्र इस तरह दिखते हैं:
d*b+(l*4+r)+(i/d)+s
मैं चर को $n
संकेतन से बदलूंगा ताकि उन्हें सीधे प्लस्पग्ल में मानों से बदला जा सके EXECUTE
(नीचे देखें):
$1*$5+($3*4+$2)+($6/$1)+$4
आप अपने मूल सूत्रों को अतिरिक्त रूप से (मानवीय आँख के लिए) संग्रहीत कर सकते हैं या इस रूप को गतिशील रूप से उत्पन्न कर सकते हैं जैसे कि:
SELECT regexp_replace(regexp_replace(regexp_replace(
regexp_replace(regexp_replace(regexp_replace(
'd*b+(l*4+r)+(i/d)+s'
, '\md\M', '$1', 'g')
, '\mr\M', '$2', 'g')
, '\ml\M', '$3', 'g')
, '\ms\M', '$4', 'g')
, '\mb\M', '$5', 'g')
, '\mi\M', '$6', 'g');
बस सुनिश्चित करें, आप अनुवाद ध्वनि है। Regexp अभिव्यक्तियों के लिए कुछ स्पष्टीकरण :
\ m .. केवल एक शब्द की शुरुआत में
मेल करता है \ M .. केवल एक शब्द के अंत में मेल खाता है
4 वाँ पैरामीटर 'g'
.. विश्व स्तर पर प्रतिस्थापित
मूलभूत कार्य
CREATE OR REPLACE FUNCTION f_calc(
d int -- days worked that month
,r int -- new nodes accuired
,l int -- loyalty score
,s numeric -- subagent commission
,b numeric -- base rate
,i numeric -- revenue gained
,formula text
,OUT result numeric
) RETURNS numeric AS
$func$
BEGIN
EXECUTE 'SELECT '|| formula
INTO result
USING $1, $2, $3, $4, $5, $6;
END
$func$ LANGUAGE plpgsql SECURITY DEFINER IMMUTABLE;
कॉल करें:
SELECT f_calc(1, 2, 3, 4.1, 5.2, 6.3, '$1*$5+($3*4+$2)+($6/$1)+$4');
यह दिखाता है:
29.6000000000000000
प्रमुख बिंदु
फ़ंक्शन 6 मान पैरामीटर और formula text
7 वें के रूप में लेता है । मैंने सूत्र को अंतिम रूप दिया, इसलिए हम $1 .. $6
इसके बजाय उपयोग कर सकते हैं $2 .. $7
। सिर्फ पठनीयता के लिए।
मैंने मूल्यों के लिए डेटा प्रकार असाइन किए हैं जैसा कि मैंने फिट देखा। उचित प्रकार असाइन करें (बुनियादी स्वच्छता जांच को लागू करने के लिए) या बस उन सभी को बनाएं numeric
:
USING
क्लॉज के साथ गतिशील निष्पादन के लिए मानों को पास करें । यह आगे और पीछे कास्टिंग से बचा जाता है और सब कुछ सरल, सुरक्षित और तेज बनाता है।
मैं एक OUT
पैरामीटर का उपयोग करता हूं क्योंकि यह अधिक सुरुचिपूर्ण है और छोटे स्पष्ट वाक्यविन्यास के लिए बनाता है। एक अंतिम RETURN
जरूरत नहीं है, OUT पैरामीटर (मानों) का मान स्वचालित रूप से वापस आ जाता है।
मैनुअल में @Chris और अध्याय "लेखन सुरक्षा DEFINER फ़ंक्शंस" द्वारा सुरक्षा पर व्याख्यान पर विचार करें । मेरे डिजाइन में, इंजेक्शन का एकल बिंदु सूत्र ही है।
आप कॉल को और सरल बनाने के लिए कुछ मापदंडों के लिए चूक का उपयोग कर सकते हैं ।