学生缴费存储过程

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;

 --摘自缴费

猜你喜欢

转载自563432906.iteye.com/blog/2263502
今日推荐