create or replace procedure SFGL_XSJF (p_xh in varchar2, p_xn in varchar2, p_xf in varchar2, p_zsf in varchar2, p_ybf in varchar2, p_qt in varchar2, p_czr in varchar2, o_errMsg out varchar2) is /** * 学生缴费情况 * 功能:根据费用更新应缴费用表的'已缴费用'、'未缴费用'字段,同时插入缴费记录 * 2015年11月17日 * p_xh 学号 * p_xn 学年 * p_xf 学费 * p_zsf 住宿费 * p_ybf 医保费 * p_qt 其他费用 * p_czr 当前操作人 * o_errMsg 返回出错信息 */ v_yjfyid sfgl_yjfy.yjfyid%TYPE; -- 应缴费用表的id v_fy sfgl_yjfy.fy%TYPE; -- 应缴费用表的应缴费用 v_yjfy sfgl_yjfy.yjfy%TYPE; -- 应缴费用表的已缴费用 v_wjfy sfgl_yjfy.wjfy%TYPE; -- 应缴费用表的未缴费用 p_sx sfgl_yjfy.wjfy%TYPE; --- 缴纳其他费用剩下金额 begin ---学费不为空并且大于0 if p_xf is not null and p_xf >0 then SELECT t.YJFYID,t.fy,t.yjfy,t.wjfy into v_yjfyid,v_fy,v_yjfy,v_wjfy FROM sfgl_yjfy t WHERE t.yjyh = ( SELECT xsid FROM sfgl_xsxx WHERE xh=p_xh) and t.xn=p_xn and t.fylx='1'; --更新应缴费用的'已缴费用'、'未缴费用'字段 --缴纳学费大于等于未缴费用 if p_xf-v_wjfy>= 0 and v_wjfy >0 then update sfgl_yjfy t set t.YJFY = t.fy,t.wjfy =0,t.modified_time = sysdate WHERE YJFYID = v_yjfyid; --插入一条缴费数据到缴费记录表 insert into sfgl_jfjl (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By) values (Xl_Sfgl_Jfjl.NEXTVAL,v_yjfyid,'1',to_number(v_fy-v_yjfy),'0',sysdate,p_czr,sysdate,p_czr); --缴纳学费小于未缴费用 elsif p_xf-v_wjfy< 0 and v_wjfy >0 then update sfgl_yjfy t set t.YJFY = t.YJFY+p_xf,t.wjfy =t.wjfy-p_xf,t.modified_time = sysdate WHERE YJFYID = v_yjfyid; --插入一条缴费数据到缴费记录表 insert into sfgl_jfjl (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By) values (Xl_Sfgl_Jfjl.NEXTVAL,v_yjfyid,'1',p_xf,'0',sysdate,p_czr,sysdate,p_czr); end if; end if; ---住宿费不为空并且大于0 if p_zsf is not null and p_zsf >0 then SELECT t.YJFYID,t.fy,t.yjfy,t.wjfy into v_yjfyid,v_fy,v_yjfy,v_wjfy FROM sfgl_yjfy t WHERE t.yjyh = ( SELECT xsid FROM sfgl_xsxx WHERE xh=p_xh) and t.xn=p_xn and t.fylx='2'; --更新应缴费用的'已缴费用'、'未缴费用'字段 --缴纳住宿费大于等于未缴费用 if p_zsf-v_wjfy>= 0 and v_wjfy >0 then update sfgl_yjfy t set t.YJFY = t.fy,t.wjfy =0,t.modified_time = sysdate WHERE YJFYID = v_yjfyid; --插入一条缴费数据到缴费记录表 insert into sfgl_jfjl (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By) values (Xl_Sfgl_Jfjl.NEXTVAL,v_yjfyid,'1',to_number(v_fy-v_yjfy),'0',sysdate,p_czr,sysdate,p_czr); --缴纳住宿费小于未缴费用 elsif p_zsf-v_wjfy< 0 and v_wjfy >0 then update sfgl_yjfy t set t.YJFY = t.YJFY+p_zsf,t.wjfy =t.wjfy-p_zsf,t.modified_time = sysdate WHERE YJFYID = v_yjfyid; --插入一条缴费数据到缴费记录表 insert into sfgl_jfjl (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By) values (Xl_Sfgl_Jfjl.NEXTVAL,v_yjfyid,'1',p_zsf,'0',sysdate,p_czr,sysdate,p_czr); end if; end if; ---医保费不为空并且大于0 if p_ybf is not null and p_ybf >0 then SELECT t.YJFYID,t.fy,t.yjfy,t.wjfy into v_yjfyid,v_fy,v_yjfy,v_wjfy FROM sfgl_yjfy t WHERE t.yjyh = ( SELECT xsid FROM sfgl_xsxx WHERE xh=p_xh) and t.xn=p_xn and t.fylx='3'; --更新应缴费用的'已缴费用'、'未缴费用'字段 --缴纳医保费大于等于未缴费用 if p_ybf-v_wjfy>= 0 and v_wjfy >0 then update sfgl_yjfy t set t.YJFY = t.fy,t.wjfy =0,t.modified_time = sysdate WHERE YJFYID = v_yjfyid; --插入一条缴费数据到缴费记录表 insert into sfgl_jfjl (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By) values (Xl_Sfgl_Jfjl.NEXTVAL,v_yjfyid,'1',to_number(v_fy-v_yjfy),'0',sysdate,p_czr,sysdate,p_czr); --缴纳医保费小于未缴费用 elsif p_ybf-v_wjfy< 0 and v_wjfy >0 then update sfgl_yjfy t set t.YJFY = t.YJFY+p_ybf,t.wjfy =t.wjfy-p_ybf,t.modified_time = sysdate WHERE YJFYID = v_yjfyid; --插入一条缴费数据到缴费记录表 insert into sfgl_jfjl (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By) values (Xl_Sfgl_Jfjl.NEXTVAL,v_yjfyid,'1',p_ybf,'0',sysdate,p_czr,sysdate,p_czr); end if; end if; ---其他费不为空并且大于0 if p_qt is not null and p_qt >0 then p_sx:=p_qt; for rec_qtfy in (SELECT t.* FROM sfgl_yjfy t WHERE t.yjyh = ( SELECT xsid FROM sfgl_xsxx WHERE xh=p_xh) and t.xn=p_xn and t.fylx='4') loop --更新应缴费用的'已缴费用'、'未缴费用'字段 --缴纳其他费用大于等于未缴费用 if p_sx-rec_qtfy.wjfy>= 0 and p_sx>0 and rec_qtfy.wjfy > 0 then update sfgl_yjfy t set t.YJFY = t.fy,t.wjfy =0,t.modified_time = sysdate WHERE t.yjfyid = rec_qtfy.yjfyid; --插入一条缴费数据到缴费记录表 insert into sfgl_jfjl (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By) SELECT Xl_Sfgl_Jfjl.NEXTVAL,YJFYID,'1',rec_qtfy.fy-rec_qtfy.yjfy,'0',sysdate,p_czr,sysdate,p_czr FROM sfgl_yjfy WHERE yjfyid = rec_qtfy.yjfyid; --缴纳其他费用小于未缴费用 elsif p_sx-rec_qtfy.wjfy< 0 and p_sx>0 and rec_qtfy.wjfy > 0 then update sfgl_yjfy t set t.YJFY = t.YJFY+p_sx,t.wjfy =t.wjfy-p_sx,t.modified_time = sysdate WHERE t.yjfyid = rec_qtfy.yjfyid; --插入一条缴费数据到缴费记录表 insert into sfgl_jfjl (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By) SELECT Xl_Sfgl_Jfjl.NEXTVAL,YJFYID,'1',p_sx,'0',sysdate,p_czr,sysdate,p_czr FROM sfgl_yjfy WHERE yjfyid = rec_qtfy.yjfyid; end if; p_sx :=p_sx-(rec_qtfy.fy-rec_qtfy.yjfy); --剩下费用 end loop; end if; exception when others then --o_errMsg:=o_errMsg||':程序运行出现内部错误,请联系管理员。'||dbms_utility.format_error_backtrace()||'---'||SQLCODE||'---'||SQLERRM; o_errMsg := '执行失败'; rollback; end SFGL_XSJF;
--摘自缴费