Chuẩn bị
Công thức của bạn trông như thế này:
d*b+(l*4+r)+(i/d)+s
Tôi sẽ thay thế các biến bằng $n
ký hiệu để chúng có thể được thay thế bằng các giá trị trực tiếp trong plpgsql EXECUTE
(xem bên dưới):
$1*$5+($3*4+$2)+($6/$1)+$4
Bạn có thể lưu trữ thêm các công thức ban đầu của mình (đối với mắt người) hoặc tạo biểu mẫu này một cách linh hoạt với một biểu thức như:
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');
Chỉ cần chắc chắn, bạn dịch là âm thanh. Một số giải thích cho các biểu thức regrec :
\ m .. chỉ khớp ở đầu một từ
\ M .. chỉ khớp ở cuối từ
Tham số thứ 4 'g'
.. thay thế trên toàn cầu
Chức năng cốt lõi
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;
Gọi:
SELECT f_calc(1, 2, 3, 4.1, 5.2, 6.3, '$1*$5+($3*4+$2)+($6/$1)+$4');
Trả về:
29.6000000000000000
Những điểm chính
Hàm lấy 6 tham số giá trị và formula text
là thứ 7. Tôi đặt công thức cuối cùng, vì vậy chúng ta có thể sử dụng $1 .. $6
thay vì $2 .. $7
. Chỉ vì mục đích dễ đọc.
Tôi đã gán các kiểu dữ liệu cho các giá trị mà tôi thấy phù hợp. Chỉ định các loại thích hợp (để thực hiện kiểm tra vệ sinh cơ bản) hoặc chỉ thực hiện tất cả numeric
:
Truyền vào các giá trị để thực hiện động với USING
mệnh đề. Điều này tránh việc truyền qua lại và làm cho mọi thứ đơn giản hơn, an toàn hơn và nhanh hơn.
Tôi sử dụng một OUT
tham số vì điều đó thanh lịch hơn và làm cho cú pháp rõ ràng ngắn hơn. RETURN
Không cần một bản cuối cùng , giá trị của (các) tham số OUT được trả về tự động.
Hãy xem xét bài giảng về bảo mật của @Chris và chương "Viết các chức năng DEFINER AN NINH một cách an toàn" trong hướng dẫn. Trong thiết kế của tôi, điểm tiêm duy nhất là chính công thức.
Bạn có thể sử dụng mặc định cho một số tham số để đơn giản hóa cuộc gọi hơn nữa.