用Oracle存储过程怎么实现这个功能(急)

a2506560872 2012-04-06 12:19:35
说明:1.档的概念:通过档来进行分层计算。
2.档的个数:每个人档的个数和比例是不一定的。
3.档的个数和比例放在数据库的demo表中。
4.通过存储过程来计算金额。
例子:比如说某个一他有3档。
如果他有3000块钱,有2档,比例分别是90,50,限额是1000,5000
计算金额=1000*90+(3000-1000)*50
因为档的个数和比例是不一定的,只能通过存储过程来查。我该怎么进行计算?
...全文
118 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
我心飞翔 2012-04-06
  • 打赏
  • 举报
回复
这说的也不是外语啊,可就是看不懂。
a2506560872 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:

把表结构,测试数据,想要的结果提供下

这个功能正在开发,表还没有建。表里大概放三个字段,一个是档的级别,另一个是档的比例,还有一个是ID号。可以通过id号来查出该id人下最多有几档。然后通过计算来算出这个人需要交多少钱。
如果他有3000块钱,有2档,比例分别是90,50,限额是1000,5000
计算金额=1000*90+(3000-1000)*5……
[/Quote]额,说错了,还短一个字段。那就是档的限额。
a2506560872 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

把表结构,测试数据,想要的结果提供下
[/Quote]
这个功能正在开发,表还没有建。表里大概放三个字段,一个是档的级别,另一个是档的比例,还有一个是ID号。可以通过id号来查出该id人下最多有几档。然后通过计算来算出这个人需要交多少钱。
如果他有3000块钱,有2档,比例分别是90,50,限额是1000,5000
计算金额=1000*90+(3000-1000)*50
ssqtjffcu 2012-04-06
  • 打赏
  • 举报
回复
把表结构,测试数据,想要的结果提供下
a2506560872 2012-04-06
  • 打赏
  • 举报
回复
膜拜,给分
既生瑜 2012-04-06
  • 打赏
  • 举报
回复
9楼写的 真不错 想的也挺周到!学习先
我心飞翔 2012-04-06
  • 打赏
  • 举报
回复
测试数据:

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;



既生瑜 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

什么没看懂?例如表里的字段
姓名 档数 限额 比例
小王……
[/Quote]

小王和小李的计算公式不一样!
小王得到的钱= 1000*0.9+(2000-1000)*0.5+(3000-1000)*0.4
小李得到的钱= 1000*0.9+(1400-1000)*0.8+ (3000-1400)*0.5
a2506560872 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

循环每个人不同的档,依次计算就可以了,很简单。
[/Quote]

嗯,我Oracle学的不怎么好。大牛可以给个例子吗?
andyguan01_2 2012-04-06
  • 打赏
  • 举报
回复
循环每个人不同的档,依次计算就可以了,很简单。
a2506560872 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

这说的也不是外语啊,可就是看不懂。
[/Quote]
什么没看懂?例如表里的字段
姓名 档数 限额 比例
小王 1 1000 90
小王 2 2000 50
小王 3 5000 40
小李 1 1000 90
小李 2 1400 80
小李 3 5000 50

-----限额和比例都是 不确定的。就上上表的例子
通过比例和限额进行计算。
如果小王和小李同交了3000快钱,那么通过计算:
小王得到的钱= 1000*0.9+(2000-1000)*0.5+(3000-1000)*0.4
小李得到的钱= 1000*0.9 +(1400-1000)*0.8+(3000-1400)*0.5

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧