【发布时间】:2020-04-09 04:07:43
【问题描述】:
对 PL/SQL 来说还是有点新,但基本上我正在尝试创建一个函数,该函数将根据一个人在过去 8 年中支付的金额来计算他们的分数。它使用每年的总和进行计算。公式为 (Year-1)/Year-2) * (Year-2/Year-3) * (Year3/Year4) 等等。更棘手的是,我需要跳过他们给出 0 的年份。
例如:
这是我目前的代码:
CREATE OR REPLACE FUNCTION formula
(idnum IN NUMBER)
RETURN NUMBER IS score NUMBER;
-- Declare Variables
currentyear NUMBER := EXTRACT (YEAR FROM SYSDATE);
previousyear NUMBER := currentyear - 1;
yeareight NUMBER := currentyear - 8;
previoussum NUMBER := 0;
currentsum NUMBER := 0;
placeholder NUMBER := 0;
score NUMBER := 1;
BEGIN
-- Set Score to 0 if no history of payments in the last 8 years
SELECT NVL(SUM(amount), 0)
INTO currentsum
FROM moneytable g
WHERE g.id_number = idnum
AND g.fiscal_year BETWEEN yeareight AND previousyear;
IF currentsum = 0 THEN score := 0;
ELSE
-- Loop to calculate Score
-- Score formula is (Year-1/Year -2) * (Year-2/Year-3) and so on for the last 8 years
-- Zeroes ignored for above calculations
-- Score defaults to 1 if only one year has any gifts
FOR counter IN 1..8
LOOP
currentyear := currentyear - 1;
placeholder := 0;
SELECT NVL(SUM(amount), 0)
INTO currentsum
FROM moneytable g
WHERE g.id_number = idnum
AND g.fiscal_year = currentyear;
IF currentsum = 0 THEN CONTINUE;
ELSE placeholder := previoussum / currentsum; END IF;
previoussum := currentsum;
IF currentsum > 0 AND placeholder > 0 THEN score := score * placeholder; END IF;
END LOOP;
END IF;
RETURN score;
END;
它有效并且给出了正确的分数,但是如果我尝试一次为几个人运行它,它会运行得非常慢。有没有更高效、优化的方法来创建这个函数?
【问题讨论】:
标签: sql oracle function for-loop plsql