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;
----摘自收费管理系统,导入减免