into多个字段,if语句

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;

 ----摘自收费管理系统,导入减免

猜你喜欢

转载自563432906.iteye.com/blog/2257234