Підготуватися
Ваші формули виглядають так:
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 :
\ 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 та розділ "Написання функції безпечного функціонування" у посібнику. У моєму дизайні єдиною точкою введення є сама формула.
Ви можете використовувати параметри за замовчуванням для деяких параметрів, щоб додатково спростити виклик.