create or replace procedure SFGL_SYNCJM_TEMP(p_czr in varchar2,
res_str OUT VARCHAR2,
res_code OUT VARCHAR2) is
/**
* 同步临时表
* 功能:遍历减免费用临时表,先根据应缴用户、学年、费用类型去更新应缴费用表的'已缴费用'字段(减免就相当于已缴),
* 然后插入一条减免数据到缴费记录表中,最后统计这个学生减免的总费用更新学生信息表中的'减免字段'。
* 2015年11月16日
* p_czr 操作人
* res_str 返回执行结果
* res_code 返回结果代码
*/
v_yjfyid sfgl_yjfy.yjfyid%TYPE; -- 应缴费用表的id
v_fy sfgl_yjfy.fy%TYPE; -- 应缴费用表的费用字段
v_yjfy sfgl_yjfy.yjfy%TYPE; -- 应缴费用表的已缴费用
begin
for rec_jmfy in (SELECT * FROM sfgl_jmfy_temp) loop
--根据应缴用户、学年、费用类型查找应缴费用的id
SELECT a.YJFYID,a.fy,a.yjfy into v_yjfyid,v_fy,v_yjfy
FROM sfgl_yjfy a
WHERE a.yjyh in (SELECT s.xsid FROM sfgl_xsxx s WHERE s.xh = rec_jmfy.xh)
and a.xn = rec_jmfy.xn
and a.fylx = rec_jmfy.jmlx
group by a.YJFYID,a.fy,a.yjfy;
--更新应缴费用的'已缴费用'字段,如果应缴费用表中的(已缴费用+减免费用)<费用,则累加已缴费用;
--如果应缴费用表中的已缴费用!=费用 并且 (已缴费用+减免费用)>费用,则直接等于费用;当已缴费用=费用时不操作
if v_fy > (v_yjfy+rec_jmfy.jmje) then
update sfgl_yjfy set YJFY = YJFY+rec_jmfy.jmje 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,'3',rec_jmfy.jmje,'0',sysdate,p_czr,sysdate,p_czr);
-- 统计减免费用到学生信息表的'减免费用'字段
update sfgl_xsxx set jmfy = jmfy + rec_jmfy.jmje
WHERE xh = rec_jmfy.xh;
elsif v_fy != v_yjfy and v_fy < (v_yjfy+rec_jmfy.jmje) then
update sfgl_yjfy set YJFY = v_fy 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,'3',v_fy-v_yjfy,'0',sysdate,p_czr,sysdate,p_czr);
-- 统计减免费用到学生信息表的'减免费用'字段
update sfgl_xsxx set jmfy = jmfy + v_fy-v_yjfy
WHERE xh = rec_jmfy.xh;
end if;
end loop;
COMMIT;
res_str := '执行成功';
res_code := 'S';
exception
when others then
--res_str:=res_str||':程序运行出现内部错误,请联系管理员。'||dbms_utility.format_error_backtrace()||'---'||SQLCODE||'---'||SQLERRM;
res_str := '执行失败';
res_code := 'E';
rollback;
end SFGL_SYNCJM_TEMP;
----摘自收费管理系统,导入减免