求一段用于ORACLE数据库的PL-SQL写的代码

用PL-SQL写一个函数,用来计算个人所得税:传入工资数,传出个税数。扣除标准:每月1600元,计算个人所得税税率表:工资、薪金所得适用级数全月应纳税所得额税率(%)1不... 用PL-SQL写一个函数,用来计算个人所得税:传入工资数,传出个税数。

扣除标准:每月1600元,计算个人所得税税率表 :工资、薪金所得适用
级 数 全月应纳税所得额 税率(%)
1 不超过500元的 5
2 超过500元至2000元的部分 10
3 超过2000元至5000元的部分 15
4 超过5000元至20000元的部分 20
5 超过20000元至40000元的部分 25
6 超过40000元至60000元的部分 30
7 超过60000元至80000元的部分 35
8 超过80000元至100000元的部分 40
9 超过100000元的部分 45
展开
 我来答
king_java
2010-03-20 · TA获得超过364个赞
知道小有建树答主
回答量:198
采纳率:0%
帮助的人:171万
展开全部
楼上的计算有误,税额是分层计算的。

楼主我的程序已经通过测试,并且我把你的1600的起征额设置为了变量,可传入。100分好像有点少哦,呵呵!

--create by terrycui at 2010/3/20 18:00-18:45
create or replace function get_taxamount(v_totalamount number,v_startamount number)
return number is v_taxamount number;
v_taxrate number; --税率
v_balance number; --差额(计算最后一个层级税额的金额)
v_subtaxamount number; --最后一层税额之前所有层级满额的总和

begin
v_balance := v_totalamount - v_startamount;
if v_balance <= 500 then
v_taxrate := 5;
v_subtaxamount := 0;
v_balance := v_balance - 0;
elsif v_balance <= 2000 then
v_taxrate := 10;
v_subtaxamount := 25;
v_balance := v_balance - 500;
elsif v_balance <= 5000 then
v_taxrate := 15;
v_subtaxamount := 175;
v_balance := v_balance - 2000;
elsif v_balance <= 20000 then
v_taxrate := 20;
v_subtaxamount := 625;
v_balance := v_balance - 5000;
elsif v_balance <= 40000 then
v_taxrate := 25;
v_subtaxamount := 3625;
v_balance := v_balance - 20000;
elsif v_balance <= 60000 then
v_taxrate := 30;
v_subtaxamount := 8625;
v_balance := v_balance - 40000;
elsif v_balance <= 80000 then
v_taxrate := 35;
v_subtaxamount := 14625;
v_balance := v_balance - 60000;
elsif v_balance <= 100000 then
v_taxrate := 40;
v_subtaxamount := 21625;
v_balance := v_balance - 80000;
elsif v_balance > 100000 then
v_taxrate := 45;
v_subtaxamount := 29625;
v_balance := v_balance - 100000;
end if;

v_taxamount := v_balance * v_taxrate / 100 + v_subtaxamount;
return v_taxamount;
end get_taxamount;

你执行一下,然后运行:
select get_taxamount(18000,1600) from dual --18000是薪水总额,1600是起征额。

加分加分~~
灵宝魔刹
2010-03-20
知道答主
回答量:30
采纳率:0%
帮助的人:20.6万
展开全部
create or replace function ATESTHL(N_IN Integer) return varchar2 is
ReturnValue number(18,2);
begin
-- Test statements here
if N_IN <= 500 then
select (N_IN*0.05) into ReturnValue from dual;
end if;
if N_IN > 500 and N_IN <= 2000 then
select (N_IN*0.1) into ReturnValue from dual;
end if;
if N_IN > 2000 and N_IN <= 5000 then
select N_IN*0.15 into ReturnValue from dual;
end if;
if N_IN > 5000 and N_IN <= 20000 then
select N_IN*0.2 into ReturnValue from dual;
end if;
if N_IN > 20000 and N_IN <= 40000 then
select N_IN*0.25 into ReturnValue from dual;
end if;
if N_IN > 40000 and N_IN <= 60000 then
select N_IN*0.3 into ReturnValue from dual;
end if;
if N_IN > 60000 and N_IN <= 80000 then
select N_IN*0.35 into ReturnValue from dual;
end if;
if N_IN > 80000 and N_IN <= 100000 then
select N_IN*0.4 into ReturnValue from dual;
end if;
if N_IN > 100000 then
select N_IN*0.45 into ReturnValue from dual;
end if;
return (ReturnValue);
end;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式