17,086
社区成员
发帖
与我相关
我的任务
分享
DROP TABLE T178;
CREATE TABLE T178
(
NAME VARCHAR2(20),
Lev NUMBER(2),
QUOTA NUMBER(6),
PERCENT NUMBER(3)
);
INSERT INTO T178 VALUES('小王', 1, 1000, 90);
INSERT INTO T178 VALUES('小王', 2, 2000, 50);
INSERT INTO T178 VALUES('小王', 3, 5000, 40);
INSERT INTO T178 VALUES('小李', 1, 1000, 90);
INSERT INTO T178 VALUES('小李', 2, 1400, 80);
INSERT INTO T178 VALUES('小李', 3, 5000, 50);
CREATE OR REPLACE FUNCTION getValue(pName VARCHAR2, pTotal NUMBER) RETURN NUMBER
IS
Result NUMBER := 0;
vLevel NUMBER; --记录处于第几个档
TYPE QuotaArray IS TABLE OF NUMBER(6) INDEX BY BINARY_INTEGER;
vQuotaArray QuotaArray;
TYPE PercentArray IS TABLE OF NUMBER(2) INDEX BY BINARY_INTEGER;
vPercentArray PercentArray;
CURSOR cur(ppName VARCHAR2) IS SELECT Lev, Quota, Percent FROM T178
WHERE NAME = ppName;
BEGIN
FOR r IN cur(pName) LOOP
vLevel := r.Lev;
vQuotaArray(vLevel) := r.Quota;
vPercentArray(vLevel) := r.Percent;
IF pTotal <= r.quota THEN
EXIT;
END IF;
END LOOP;
FOR i IN 1..vLevel LOOP
IF i = 1 THEN
RESULT := RESULT + vQuotaArray(i) * vPercentArray(i) * 0.01;
ELSIF i > 1 AND i != vLevel THEN
RESULT := RESULT + (vQuotaArray(i) - vQuotaArray(i-1)) * vPercentArray(i) * 0.01;
ELSE
RESULT := RESULT + (pTotal - vQuotaArray(i - 1)) * vPercentArray(i) * 0.01;
END IF;
END LOOP;
return(Result);
END getValue;