প্রস্তুত করা
আপনার সূত্রগুলি দেখতে এইরকম:
d*b+(l*4+r)+(i/d)+s
আমি ভেরিয়েবলগুলি $n
স্বরলিপি সহ প্রতিস্থাপন করব যাতে সেগুলি সরাসরি plpgsql এ মানগুলির সাথে প্রতিস্থাপন করা যায় 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 এক্সপ্রেশন জন্য কিছু ব্যাখ্যা :
\ এম .. শব্দের শুরুতে কেবল মিল হয়
\ এম .. কেবল একটি শব্দের শেষে মেলে
চতুর্থ প্যারামিটার '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
ধারাটি সহ গতিশীল সম্পাদনের জন্য মানগুলিতে পাস করুন । এটি পিছনে পিছনে ingালাই এড়ানো এবং সবকিছুকে সহজ, নিরাপদ এবং দ্রুত করে তোলে।
আমি একটি OUT
প্যারামিটার ব্যবহার করি কারণ এটি আরও মার্জিত এবং আরও কম সংক্ষিপ্ততর সিনট্যাক্স তৈরি করে। একটি চূড়ান্ত RETURN
প্রয়োজন হয় না, আউট প্যারামিটার (গুলি) এর মান স্বয়ংক্রিয়ভাবে ফিরে আসে।
ম্যানুয়ালটিতে @ ক্রিস দ্বারা সুরক্ষা সম্পর্কিত বক্তৃতা এবং " সিকিউরিটি ডিফাইনার ফাংশনগুলি নিরাপদে লেখা" অধ্যায়টি বিবেচনা করুন । আমার ডিজাইনে, ইনজেকশনটির একক পয়েন্ট হ'ল সূত্রটি।
কলটি আরও সহজ করার জন্য আপনি কিছু পরামিতিগুলির জন্য ডিফল্ট ব্যবহার করতে পারেন ।