Oracle 存储过程

引用自:http://www.cnblogs.com/jsping/archive/2012/11/22/2782752.html

create or replace function func_get_user_by_msisdn(msisdn in number)   
------------------------------------------------------------------------------   
---功能描述:通过用户的电话号码,调用局方存储过程 获取用户的基本信息,      ---   
---          以遍更新card_user_info本地数据表。                            ---   
---参数:   msisdn in number 代表用户的电话号码(SIM卡)                   ---     
------------------------------------------------------------------------------   
return pkg_gps_audit.user_record   
is  
  user_record_info pkg_gps_audit.user_record; --用户基本信息类型   
  v_success number := 1;  --成功标志   
    
begin  
  
 --首先获取正常用户的基本信息   
  begin  
       pkg_gps_audit.proc_get_userinfo(msisdn,user_record_info);   
       v_success := 1;   
  exception  when others then  
       v_success := 0;   
  end;   
  
  --其次,如果正常用户获取不到,再查离线用户信息   
  if v_success < 1 then  
  begin  
       pkg_gps_audit.proc_get_cancel_userinfo(msisdn,user_record_info);   
       v_success := 1;   
  exception when others then  
       v_success := 0;   
  end;   
  end if;   
     
     
  if v_success > 0 then    
    return user_record_info;   
  else  
    raise no_data_found;   
  end if;   
  
  
return user_record_info;   
end func_get_user_by_msisdn;   
  
  
  
  
  
create or replace function func_get_user_id(msisdn_bak in number)   
------------------------------------------------------------------------------   
---功能描述:通过用户的电话号码获取用户的ID,(有保证数据及时性)            ---   
---参数:   msisdn in number 代表用户的电话号码(SIM卡)                   ---      
------------------------------------------------------------------------------   
return number   
is  
user_info pkg_gps_audit.user_record; --用户基本信息   
  
card_info card_user_info%rowtype; --用户基本信息表结构    
type base_cursor is ref cursor;   
cr base_cursor;   
  
user_id number(15); --用户ID;   
begin  
  begin  
    --如果本地card_user_info表可以找到数据,先在本地查找。   
    open cr for select * from card_user_info where msisdn = msisdn_bak;   
    fetch cr into card_info;   
    if cr%found then  
         
      user_id := card_info.user_id;   
    else  
      --获取用户基本信息   
      user_info := func_get_user_by_msisdn(msisdn_bak);   
         
      user_id := user_info.user_id;   
    end if;   
       
    close cr;   
       
    --返回用户ID   
     return user_id;   
  exception    
    when others then     
    raise no_data_found;  --抛出异常   
  end;    
  
  
  
end;   
  
  
  
  
  
create or replace function func_is_first_day   
------------------------------------------------------------------------------   
---功能描述:判断今天是否是该月的第一天(1号)                             ---   
---返回参数:1代表是,0代表不是                                            ---   
------------------------------------------------------------------------------   
return number    
is  
  v_result number := 0;   
     
  v_day varchar2(2);   
begin  
  select to_char(sysdate,'dd') into v_day from dual;   
  if v_day = '01' then  
    v_result := 1;   
  else    
    v_result := 0;   
  end if;   
     
  return(v_result);   
end func_is_first_day;   
  
  
  
  
  
create or replace procedure proc_delete_day_fee_info   
------------------------------------------------------------------------------   
---功能描述: 只保留一个月得数据(8月的日账单10月份删除)                  ---   
------------------------------------------------------------------------------   
is  
  
type base_cursor is ref cursor;   
cf base_cursor;   
v_fee_id number(18);   
begin  
  begin  
    open cf for  select a.fee_id from user_fee_info a ,day_fee_info b where a.fee_id = b.fee_id and to_char(b.start_time,'yyyy-mm') = to_char(add_months(sysdate,0),'yyyy-mm');   
    fetch cf into v_fee_id;   
    while cf%found loop   
      delete from user_fee_info where fee_id = v_fee_id;   
      delete from day_fee_info where fee_id = v_fee_id;   
      commit;   
         
      fetch cf into v_fee_id;   
    end loop;   
       
    close cf;   
       
  exception when others then  
    rollback;   
    return;   
  end;     
  
  
     
end proc_delete_day_fee_info;   
  
  
  
  
create or replace procedure proc_delete_month_fee_info   
------------------------------------------------------------------------------   
---功能描述: 只保留6个月得数据(8月的日账单1月份删除)                  ---   
------------------------------------------------------------------------------   
is  
  
type base_cursor is ref cursor;   
cf base_cursor;   
v_fee_id number(18);   
begin  
  begin  
    open cf for  select a.fee_id from user_fee_info a ,month_fee_info b where a.fee_id = b.fee_id and to_char(b.start_time,'yyyy-mm') = to_char(add_months(sysdate,0),'yyyy-mm');   
    fetch cf into v_fee_id;   
    while cf%found loop   
      delete from user_fee_info where fee_id = v_fee_id;   
      delete from month_fee_info where fee_id = v_fee_id;   
      commit;   
         
      fetch cf into v_fee_id;   
    end loop;   
       
    close cf;   
       
  exception when others then  
    rollback;   
    return;   
  end;     
  
  
     
end proc_delete_month_fee_info;   
  
  
  
create or replace procedure proc_down_card_user_info   
------------------------------------------------------------------------------   
---功能描述:(重要)通过查询本地的group_sims表,获取sim号码集合。           ---   
---          该表里面的sim字段有两种类型,1种是真实的sim号码,另外一种是   ---   
---          虚拟的SIM号码,该虚拟的号码可以对应多哥真实的SIM号码。        ---   
---          simtype字段代表SIM类型,0代表是虚拟的号码,1代表是真实的号码。 ---   
---          当sim字段为虚拟号码时,对应的simtype为0,同时groupsim为空     ---   
---          当sim字段为真实号码时,对应的simtype为1,如果groupsim为空,   ---   
---          代表该号码没有对应的虚拟号。                                  ---   
---          groupuserid字段代表号码所对应的本地用户,一个用户可以对应多个 ---   
---          sim(虚拟的与真实的。)                                         ---   
---                                                                        ---   
---          遍历group_sims表,查询sim字段,如果为虚拟号码,就调用         ---   
---           proc_get_payed_msisdns,获取其绑定的真实号码,然后将该批真实  ---   
---           号码插入到group_sims,同时更新card_user_info表,如果sim是    ---   
---          真实号码,则只更新card_user_info表 。                         ---    
------------------------------------------------------------------------------   
is  
  
group_sims_info group_sims%rowtype;--定义group_sims表类型   
  
type type_group_sims_ref is ref cursor; --定义group_sims表游标类型   
group_sims_ref type_group_sims_ref;   
  
user_record_info pkg_gps_audit.user_record; --定义用户基本类型   
  
msisdn_table_temp pkg_gps_audit.msisdn_table; --用户SIM号码集合   
msisdn_len number(10) := 0; --用户SIM号码集合长度   
  
v_success number(1) := 1; --成功标志   
  
begin  
  begin  
    --打开group_sims游标   
    open group_sims_ref for select * from group_sims where (groupsim is  null or length(ltrim(groupsim)) = 0);   
    fetch group_sims_ref into group_sims_info;   
  
    --开始遍历该游标   
    while group_sims_ref%found loop   
      --首先判断是否是虚拟号码,   
      if group_sims_info.simtype = 0 then  
        --首先通过虚拟号码,获取对应的SIM号码;   
        begin  
          pkg_gps_audit.proc_get_payed_msisdns(group_sims_info.sim,msisdn_table_temp,msisdn_len);   
             
          if msisdn_len > 0 then  
            for iLen in 1 .. msisdn_len loop   
              --首先更新原来group_sims表中同一个虚拟卡所对应的sim卡(先删后插)   
              delete from group_sims t where t.simtype = 1 and to_number(t.groupsim) = group_sims_info.sim and t.groupuserid = group_sims_info.groupuserid;   
                  
                 
              for xLen in 1..msisdn_len loop   
                begin  
                  -----通过msisdn获取用户基本信息   
                  user_record_info := func_get_user_by_msisdn(msisdn_table_temp(xLen));   
                exception when others then  
                  dbms_output.put_line('通过msisdn获取用户基本信息出现了异常!');    
                  v_success := 0;   
                end;   
                 
                   
                if v_success > 0 then  
                   insert into group_sims(id,sim,groupsim,groupuserid,simtype,updatetime)values(   
                   SEQ_GROUP_SIMS.Nextval,to_char(msisdn_table_temp(xLen)),group_sims_info.sim,group_sims_info.groupuserid,   
                  1,sysdate);   
                     
                  --更新原来在card_user_info里面的数据(先删除已经存在的再插入新的数据)   
                  delete from card_user_info where msisdn =  msisdn_table_temp(xLen);   
                  
                  insert into card_user_info(user_id,msisdn,brand_name,deal_name,service_status,stop_time,status)   
                  values(user_record_info.user_id,user_record_info.msisdn,user_record_info.brand_name,user_record_info.deal_name   
                  ,user_record_info.service_status,user_record_info.stop_time,1);   
                end if;   
                    
                --提交数据   
                commit;   
              end loop;   
                  
            end loop;   
                
          end if;   
             
             
          --没有与该虚拟卡对应的SIM号码   
          if msisdn_len <= 0 then     
            --首先更新原来group_sims表中同一个虚拟卡所对应的sim卡(先删后插)   
              delete from group_sims t where t.simtype = 1 and to_number(t.groupsim) = group_sims_info.sim and t.groupuserid = group_sims_info.groupuserid;   
              commit;   
          end if;   
             
        exception when others then  
          --回滚数据   
          rollback;   
          dbms_output.put_line('首先通过虚拟号码,获取对应的SIM号码出现了异常!');   
        end;   
      end if;     
            
      --如果是真实号码,并且没有附属虚拟号码,则直接更新card_user_info表     
      if group_sims_info.simtype > 0 and  (group_sims_info.groupsim is null or length(group_sims_info.groupsim) = 0 ) then  
        begin  
          user_record_info := func_get_user_by_msisdn(group_sims_info.sim);   
             
           --更新原来在card_user_info里面的数据(先删除已经存在的再插入新的数据)   
          delete from card_user_info where msisdn =  group_sims_info.sim ;   
          insert into card_user_info(user_id,msisdn,brand_name,deal_name,service_status,stop_time,status)   
          values(user_record_info.user_id,user_record_info.msisdn,user_record_info.brand_name,user_record_info.deal_name   
          ,user_record_info.service_status,user_record_info.stop_time,1);   
             
          --提交数据   
          commit;   
         
        exception when others then  
           --回滚数据   
          rollback;   
          dbms_output.put_line('更新card_user_info表出现了异常');   
        end;   
           
           
      end if;   
  
  
      --遍历游标   
      fetch group_sims_ref into group_sims_info;   
    end loop;   
       
    --关闭游标   
    close group_sims_ref;   
  
  
  
  exception   
    when others then  
    return;   
  end;   
  
  
  
end proc_down_card_user_info;   
  
  
  
create or replace procedure proc_down_change_card   
  
------------------------------------------------------------------------------   
---功能描述:(重要)通过查询本地的group_sims表,获取sim号码集合。           ---   
---          该表里面的sim字段有两种类型,1种是真实的sim号码,另外一种是   ---   
---          虚拟的SIM号码,该虚拟的号码可以对应多哥真实的SIM号码。        ---   
---          simtype字段代表SIM类型,0代表是虚拟的号码,1代表是真实的号码。 ---   
---          当sim字段为虚拟号码时,对应的simtype为0,同时groupsim为空     ---   
---          当sim字段为真实号码时,对应的simtype为1,如果groupsim为空,   ---   
---          代表该号码没有对应的虚拟号。                                  ---   
---          groupuserid字段代表号码所对应的本地用户,一个用户可以对应多个 ---   
---          sim(虚拟的与真实的。)                                         ---   
---                                                                        ---   
---          遍历group_sims表,查询sim字段,如果为虚拟号码,就调用         ---   
---           proc_get_payed_msisdns,获取其绑定的真实号码,然后再获取换补卡---   
---           信息以更新change_card表,如果sim是真实号码,                 ---   
---            则只更新change_card表 。                                    ---     
------------------------------------------------------------------------------   
  
is  
  
group_sims_info group_sims%rowtype;--定义group_sims表类型   
  
type type_group_sims_ref is ref cursor; --定义group_sims表游标类型   
group_sims_ref type_group_sims_ref;   
  
    
  
simcard_table_temp pkg_gps_audit.simcard_table; --用户换补卡信息集合   
simcard_len number(10) := 0; --用户换补卡信息集合长度   
  
msisdn_table_temp pkg_gps_audit.msisdn_table; --用户SIM号码集合   
msisdn_len number(10) := 0; --用户SIM号码集合长度   
  
begin  
  begin  
    --打开group_sims游标   
    open group_sims_ref for select * from group_sims where (groupsim is  null or length(ltrim(groupsim)) = 0);   
    fetch group_sims_ref into group_sims_info;   
  
    --开始遍历该游标   
    while group_sims_ref%found loop   
      --首先判断是否是虚拟号码,   
      if group_sims_info.simtype = 0 then  
        --首先通过虚拟号码,获取对应的SIM号码;   
        begin  
          pkg_gps_audit.proc_get_payed_msisdns(group_sims_info.sim,msisdn_table_temp,msisdn_len);   
             
          if msisdn_len > 0 then --有数据   
            for iLen in 1 .. msisdn_len loop   
               begin  
                 --通过用户ID,获取远程的换补卡用户信息集合   
                 pkg_gps_audit.proc_get_simcard_his(func_get_user_id(msisdn_table_temp(iLen)),simcard_table_temp,simcard_len);   
             
                 --更新原来在change_card里面的数据(先删除已经存在的再插入新的数据)   
                 if simcard_len > 0 then  
                   --这个步骤的删除条件 有待确认。??   
                   delete from change_card where msisdn = group_sims_info.sim ;   
                   for ilen in 1 .. simcard_len loop   
                     insert into change_card(user_id,msisdn,accept_time,accept_memo,status) values(   
                     simcard_table_temp(ilen).user_id,simcard_table_temp(ilen).msisdn,simcard_table_temp(ilen).accept_time,   
                     simcard_table_temp(ilen).accept_memo,1);   
                   end loop;   
                 end if;   
                    
                 if simcard_len = 0 then  
                   dbms_output.put_line('通过用户IfffffffffD,获取远程的换补卡用户信息集合,出现了异常!');   
                 end if;    
                    
                 commit;   
               exception when others then  
                 dbms_output.put_line('通过用户ID,获取远程的换补卡用户信息集合,出现了异常!');   
                 rollback;   
               end;   
                 
                  
            end loop;    
          end if;   
             
             
             
        exception when others then  
          --回滚数据   
          rollback;   
          dbms_output.put_line('首先通过虚拟号码,获取对应的SIM号码出现了异常!');   
        end;   
      end if;     
            
  
      if  group_sims_info.simtype > 0 and  (group_sims_info.groupsim is null or length(group_sims_info.groupsim) = 0 ) then --如果是真实号码,并且没有附属虚拟号码,则直接更新change_card表   
        begin  
          --通过用户ID,获取远程的换补卡用户信息集合   
          pkg_gps_audit.proc_get_simcard_his(func_get_user_id(group_sims_info.sim),simcard_table_temp,simcard_len);   
             
          --更新原来在change_card里面的数据(先删除已经存在的再插入新的数据)   
          if simcard_len > 0 then  
            --这个步骤的删除条件 有待确认。??   
            delete from change_card where msisdn = group_sims_info.sim ;   
            for ilen in 1 .. simcard_len loop   
              insert into change_card(user_id,msisdn,accept_time,accept_memo,status) values(   
              simcard_table_temp(ilen).user_id,simcard_table_temp(ilen).msisdn,simcard_table_temp(ilen).accept_time,   
              simcard_table_temp(ilen).accept_memo,1);   
            end loop;   
          end if;    
             
             
          --提交数据   
          commit;   
         
        exception when others then  
           --回滚数据   
          rollback;   
           dbms_output.put_line('更新change_card表出现了异常');   
        end;   
           
           
      end if;   
  
  
      --遍历游标   
      fetch group_sims_ref into group_sims_info;   
    end loop;   
       
    --关闭游标   
    close group_sims_ref;   
  
  
  
  exception   
    when others then  
    return;   
  end;   
  
  
  
end proc_down_change_card;   
  
  
  
create or replace procedure proc_down_fee_info   
------------------------------------------------------------------------------   
---功能描述:(重要)通过查询本地的group_sims表,获取sim号码集合。           ---   
---          该表里面的sim字段有两种类型,1种是真实的sim号码,另外一种是   ---   
---          虚拟的SIM号码,该虚拟的号码可以对应多哥真实的SIM号码。        ---   
---          simtype字段代表SIM类型,0代表是虚拟的号码,1代表是真实的号码。 ---   
---          当sim字段为虚拟号码时,对应的simtype为0,同时groupsim为空     ---   
---          当sim字段为真实号码时,对应的simtype为1,如果groupsim为空,   ---   
---          代表该号码没有对应的虚拟号。                                  ---   
---          groupuserid字段代表号码所对应的本地用户,一个用户可以对应多个 ---   
---          sim(虚拟的与真实的。)                                         ---   
---                                                                        ---   
---          遍历group_sims表,查询sim字段,如果为虚拟号码,就调用         ---   
---           proc_get_payed_msisdns,获取其绑定的真实号码,然后获取每日消费---   
---           情况,再分别保存到day_fee_Info,month_fee_info两张表,如果    ---   
---           sim是 真实号码,则只更新day_fee_Info,month_fee_info表 。     ---     
------------------------------------------------------------------------------   
  
is  
  
group_sims_info group_sims%rowtype;--定义group_sims表类型   
  
type type_group_sims_ref is ref cursor; --定义group_sims表游标类型   
group_sims_ref type_group_sims_ref;   
  
  
msisdn_table_temp pkg_gps_audit.msisdn_table; --用户SIM号码集合   
msisdn_len number(10) := 0; --用户SIM号码集合长度   
  
base_fee pkg_gps_audit.fee_record;  --用户每日消费结构信息   
  
is_first_day number(1); --是否是每月一号标志   
user_fee_info_nextval number(15); --user_fee_info表的下一个序列号   
  
user_fee_info_temp pkg_gps_audit.fee_record;  --user_fee_info数据缓存   
  
v_fee_id number(15);--消费ID    
    
  
begin  
  begin  
     
    --打开group_sims游标   
    open group_sims_ref for select * from group_sims where (groupsim is  null or length(ltrim(groupsim)) = 0);   
    fetch group_sims_ref into group_sims_info;   
  
    --开始遍历该游标   
    while group_sims_ref%found loop   
      --首先判断是否是虚拟号码,   
      if group_sims_info.simtype = 0 then  
        --首先通过虚拟号码,获取对应的SIM号码;   
        begin  
          pkg_gps_audit.proc_get_payed_msisdns(group_sims_info.sim,msisdn_table_temp,msisdn_len);   
             
          if msisdn_len > 0 then --有数据   
            for iLen in 1 .. msisdn_len loop   
                 
              --首先获取该用户每日消费记录,如果今天刚好是1号,那么获取到的数据刚好是上个月1-30号的总和   
              --如果不是1号,那么获取到的是本月前几天的总和   
              pkg_gps_audit.proc_get_userfee(func_get_user_id(msisdn_table_temp(iLen)),base_fee);   
              
              --判断当前日期是否是每月1号   
              is_first_day := func_is_first_day();   
              if is_first_day = 1 then  --1号   
                 
                -----(begin)保存到user_fee_info,day_fee_info表--------------   
                begin  
                   
                -----计算出上个月的总和   
                begin  
                  select  user_id,   
                  sum(fee_base),sum(fee_pkg_month),sum(fee_keep),sum(fee_oth_month),sum(fee_vpn),   
                  sum(fee_shift),sum(fee_local),sum(fee_long),sum(fee_inprov),sum(fee_inprov_long),   
                  sum(fee_outprov),sum(fee_outprov_long),sum(fee_inter),sum(fee_inter_long),   
                  sum(fee_cmnet),sum(fee_trust),sum(fee_ptp_sms),sum(fee_mms),sum(fee_magazine),   
                  sum(fee_gprs),sum(fee_wap),sum(fee_data_month),   
                  sum(fee_data),sum(fee_ring),sum(fee_display),sum(fee_ext),sum(fee_other),   
                  sum(fee_all),sum(fee_for_others),sum(fee_by_others)    
                  into user_fee_info_temp from user_fee_info   
                  where user_id = base_fee.user_id   
                  and fee_id in (select fee_id from day_fee_info where to_char(start_time,'yyyy-mm') = to_char(add_months(sysdate,-1),'yyyy-mm'))  group by user_id ;   
                     
                exception when others then  
                  user_fee_info_temp.user_id := base_fee.user_id;   
                  user_fee_info_temp.fee_base := 0.00;   
                  user_fee_info_temp.fee_pkg_month := 0.00;   
                  user_fee_info_temp.fee_keep := 0.00;   
                  user_fee_info_temp.fee_oth_month := 0.00;   
                  user_fee_info_temp.fee_vpn := 0.00;   
                  user_fee_info_temp.fee_shift := 0.00;   
                  user_fee_info_temp.fee_local := 0.00;   
                  user_fee_info_temp.fee_long := 0.00;   
                  user_fee_info_temp.fee_inprov := 0.00;   
                  user_fee_info_temp.fee_inprov_long := 0.00;   
                  user_fee_info_temp.fee_outprov := 0.00;   
                  user_fee_info_temp.fee_outprov_long := 0.00;   
                  user_fee_info_temp.fee_inter := 0.00;   
                  user_fee_info_temp.fee_inter_long := 0.00;   
                  user_fee_info_temp.fee_cmnet := 0.00;   
                  user_fee_info_temp.fee_trust := 0.00;   
                  user_fee_info_temp.fee_ptp_sms := 0.00;   
                  user_fee_info_temp.fee_mms := 0.00;   
                  user_fee_info_temp.fee_magazine := 0.00;   
                  user_fee_info_temp.fee_gprs := 0.00;   
                  user_fee_info_temp.fee_wap := 0.00;   
                  user_fee_info_temp.fee_data_month := 0.00;   
                  user_fee_info_temp.fee_data := 0.00;   
                  user_fee_info_temp.fee_ring := 0.00;   
                  user_fee_info_temp.fee_display := 0.00;   
                  user_fee_info_temp.fee_ext := 0.00;   
                  user_fee_info_temp.fee_other := 0.00;   
                  user_fee_info_temp.fee_all := 0.00;   
                  user_fee_info_temp.fee_for_others := 0.00;   
                  user_fee_info_temp.fee_by_others := 0.00;   
                end;   
                   
                
                --保存到user_fee_info,day_fee_info表   
                select seq_user_fee_info.nextval into user_fee_info_nextval from dual;   
                insert into user_fee_info(fee_id,user_id,fee_base,fee_pkg_month,fee_keep,fee_oth_month,fee_vpn,   
                fee_shift,fee_local,fee_long,fee_inprov,fee_inprov_long,fee_outprov,fee_outprov_long,fee_inter,fee_inter_long,   
                fee_cmnet,fee_trust,fee_ptp_sms,fee_mms,fee_magazine,fee_gprs,fee_wap,fee_data_month,   
                fee_data,fee_ring,fee_display,fee_ext,fee_other,fee_all,fee_for_others,fee_by_others)   
                values(   
                user_fee_info_nextval,base_fee.user_id,   
                decode(sign(base_fee.fee_base-user_fee_info_temp.fee_base),1,base_fee.fee_base-user_fee_info_temp.fee_base,0.00),   
                decode(sign(base_fee.fee_pkg_month-user_fee_info_temp.fee_pkg_month),1,base_fee.fee_pkg_month-user_fee_info_temp.fee_pkg_month,0.00),   
                decode(sign(base_fee.fee_keep-user_fee_info_temp.fee_keep),1,base_fee.fee_keep-user_fee_info_temp.fee_keep,0.00),    
                decode(sign(base_fee.fee_oth_month-user_fee_info_temp.fee_oth_month),1,base_fee.fee_oth_month-user_fee_info_temp.fee_oth_month,0.00),     
                decode(sign(base_fee.fee_vpn-user_fee_info_temp.fee_vpn),1,base_fee.fee_vpn-user_fee_info_temp.fee_vpn,0.00),      
                decode(sign(base_fee.fee_shift-user_fee_info_temp.fee_shift),1,base_fee.fee_shift-user_fee_info_temp.fee_shift,0.00),       
                decode(sign(base_fee.fee_local-user_fee_info_temp.fee_local),1,base_fee.fee_local-user_fee_info_temp.fee_local,0.00),       
                decode(sign(base_fee.fee_long-user_fee_info_temp.fee_long),1,base_fee.fee_long-user_fee_info_temp.fee_long,0.00),       
                decode(sign(base_fee.fee_inprov-user_fee_info_temp.fee_inprov),1,base_fee.fee_inprov-user_fee_info_temp.fee_inprov,0.00),       
                decode(sign(base_fee.fee_inprov_long-user_fee_info_temp.fee_inprov_long),1,base_fee.fee_inprov_long-user_fee_info_temp.fee_inprov_long,0.00),       
                decode(sign(base_fee.fee_outprov-user_fee_info_temp.fee_outprov),1,base_fee.fee_outprov-user_fee_info_temp.fee_outprov,0.00),       
                decode(sign(base_fee.fee_outprov_long-user_fee_info_temp.fee_outprov_long),1,base_fee.fee_outprov_long-user_fee_info_temp.fee_outprov_long,0.00),       
                decode(sign(base_fee.fee_inter-user_fee_info_temp.fee_inter),1,base_fee.fee_inter-user_fee_info_temp.fee_inter,0.00),       
                decode(sign(base_fee.fee_inter_long-user_fee_info_temp.fee_inter_long),1,base_fee.fee_inter_long-user_fee_info_temp.fee_inter_long,0.00),        
                decode(sign(base_fee.fee_cmnet-user_fee_info_temp.fee_cmnet),1,base_fee.fee_cmnet-user_fee_info_temp.fee_cmnet,0.00),         
                decode(sign(base_fee.fee_trust-user_fee_info_temp.fee_trust),1,base_fee.fee_trust-user_fee_info_temp.fee_trust,0.00),          
                decode(sign(base_fee.fee_ptp_sms-user_fee_info_temp.fee_ptp_sms),1,base_fee.fee_ptp_sms-user_fee_info_temp.fee_ptp_sms,0.00),           
                decode(sign(base_fee.fee_mms-user_fee_info_temp.fee_mms),1,base_fee.fee_mms-user_fee_info_temp.fee_mms,0.00),            
                decode(sign(base_fee.fee_magazine-user_fee_info_temp.fee_magazine),1,base_fee.fee_magazine-user_fee_info_temp.fee_magazine,0.00),             
                decode(sign(base_fee.fee_gprs-user_fee_info_temp.fee_gprs),1,base_fee.fee_gprs-user_fee_info_temp.fee_gprs,0.00),             
                decode(sign(base_fee.fee_wap-user_fee_info_temp.fee_wap),1,base_fee.fee_wap-user_fee_info_temp.fee_wap,0.00),              
                decode(sign(base_fee.fee_data_month-user_fee_info_temp.fee_data_month),1,base_fee.fee_data_month-user_fee_info_temp.fee_data_month,0.00),               
                decode(sign(base_fee.fee_data-user_fee_info_temp.fee_data),1,base_fee.fee_data-user_fee_info_temp.fee_data,0.00),                 
                decode(sign(base_fee.fee_ring-user_fee_info_temp.fee_ring),1,base_fee.fee_ring-user_fee_info_temp.fee_ring,0.00),                  
                decode(sign(base_fee.fee_display-user_fee_info_temp.fee_display),1,base_fee.fee_display-user_fee_info_temp.fee_display,0.00),                  
                decode(sign(base_fee.fee_ext-user_fee_info_temp.fee_ext),1,base_fee.fee_ext-user_fee_info_temp.fee_ext,0.00),                  
                decode(sign(base_fee.fee_other-user_fee_info_temp.fee_other),1,base_fee.fee_other-user_fee_info_temp.fee_other,0.00),                   
                decode(sign(base_fee.fee_all-user_fee_info_temp.fee_all),1,base_fee.fee_all-user_fee_info_temp.fee_all,0.00),                   
                decode(sign(base_fee.fee_for_others-user_fee_info_temp.fee_for_others),1,base_fee.fee_for_others-user_fee_info_temp.fee_for_others,0.00),                   
                decode(sign(base_fee.fee_by_others-user_fee_info_temp.fee_by_others),1,base_fee.fee_by_others-user_fee_info_temp.fee_by_others,0.00) );   
                
                insert into day_fee_info(id,fee_id,start_time) values(seq_day_fee_info.nextval,user_fee_info_nextval,sysdate-1);   
                   
                commit;   
                exception when others then  
                  rollback;   
                  dbms_output.put_line('保存到user_fee_info,day_fee_info表出现了异常');   
                end;   
                -------------(end)保存到user_fee_info,day_fee_info表-------------------------------------   
                
                
                -------------------(begin)保存到user_fee_info,month_fee_info表---------------------------------   
                begin  
                   
                begin  
                ----首先删除再更新原来的user_fee_info,month_fee_info   
                select a.fee_id  into v_fee_id  from month_fee_info a, user_fee_info b where a.fee_id = b.fee_id and b.user_id = base_fee.user_id   and to_char(a.start_time,'yyyy-mm') = to_char(add_months(sysdate,-1),'yyyy-mm');   
                delete from user_fee_info x where x.fee_id = v_fee_id;   
                delete from month_fee_info y where y.fee_id = v_fee_id;    
                commit;   
                   
                   
                exception when others then  
                  rollback;   
                end;   
                ----插入新的数据   
                select seq_user_fee_info.nextval into user_fee_info_nextval from dual;   
                insert into user_fee_info(fee_id,user_id,fee_base,fee_pkg_month,fee_keep,fee_oth_month,fee_vpn,   
                fee_shift,fee_local,fee_long,fee_inprov,fee_inprov_long,fee_outprov,fee_outprov_long,fee_inter,fee_inter_long,   
                fee_cmnet,fee_trust,fee_ptp_sms,fee_mms,fee_magazine,fee_gprs,fee_wap,fee_data_month,   
                fee_data,fee_ring,fee_display,fee_ext,fee_other,fee_all,fee_for_others,fee_by_others)   
                values( user_fee_info_nextval,base_fee.user_id, base_fee.fee_base, base_fee.fee_pkg_month,   
                base_fee.fee_keep, base_fee.fee_oth_month, base_fee.fee_vpn,   
                base_fee.fee_shift, base_fee.fee_local, base_fee.fee_long, base_fee.fee_inprov,   
                base_fee.fee_inprov_long, base_fee.fee_outprov, base_fee.fee_outprov_long,   
                base_fee.fee_inter, base_fee.fee_inter_long, base_fee.fee_cmnet,   
                base_fee.fee_trust, base_fee.fee_ptp_sms,  base_fee.fee_mms,   
                base_fee.fee_magazine,  base_fee.fee_gprs,  base_fee.fee_wap,   
                base_fee.fee_data_month,  base_fee.fee_data,  base_fee.fee_ring,   
                base_fee.fee_display, base_fee.fee_ext,  base_fee.fee_other,   
                base_fee.fee_all,  base_fee.fee_for_others, base_fee.fee_by_others);   
               
                insert into month_fee_info(id,fee_id,start_time) values(seq_month_fee_info.nextval,user_fee_info_nextval,sysdate-1);        
                commit;   
                exception when others then  
                  rollback;   
                  dbms_output.put_line('保存到user_fee_info,month_fee_info表出现了异常');   
                end;   
                ----------------(end)保存到user_fee_info,month_fee_info表--------------------------------------   
                 
              else --不是本月第一天   
                 
                -------------------(begin)保存到user_fee_info,day_fee_info表-------------------   
                begin  
                   
                begin  
                --计算出本月的总和   
                select  user_id,   
                sum(fee_base),sum(fee_pkg_month),sum(fee_keep),sum(fee_oth_month),sum(fee_vpn),   
                sum(fee_shift),sum(fee_local),sum(fee_long),sum(fee_inprov),sum(fee_inprov_long),   
                sum(fee_outprov),sum(fee_outprov_long),sum(fee_inter),sum(fee_inter_long),   
                sum(fee_cmnet),sum(fee_trust),sum(fee_ptp_sms),sum(fee_mms),sum(fee_magazine),   
                sum(fee_gprs),sum(fee_wap),sum(fee_data_month),   
                sum(fee_data),sum(fee_ring),sum(fee_display),sum(fee_ext),sum(fee_other),   
                sum(fee_all),sum(fee_for_others),sum(fee_by_others)    
                into user_fee_info_temp from user_fee_info   
                where user_id =  base_fee.user_id   
                and fee_id in (select fee_id from day_fee_info where to_char(start_time,'yyyy-mm') = to_char(sysdate,'yyyy-mm'))  group by user_id ;   
                   
                exception when others then  
                  user_fee_info_temp.user_id := base_fee.user_id;   
                  user_fee_info_temp.fee_base := 0.00;   
                  user_fee_info_temp.fee_pkg_month := 0.00;   
                  user_fee_info_temp.fee_keep := 0.00;   
                  user_fee_info_temp.fee_oth_month := 0.00;   
                  user_fee_info_temp.fee_vpn := 0.00;   
                  user_fee_info_temp.fee_shift := 0.00;   
                  user_fee_info_temp.fee_local := 0.00;   
                  user_fee_info_temp.fee_long := 0.00;   
                  user_fee_info_temp.fee_inprov := 0.00;   
                  user_fee_info_temp.fee_inprov_long := 0.00;   
                  user_fee_info_temp.fee_outprov := 0.00;   
                  user_fee_info_temp.fee_outprov_long := 0.00;   
                  user_fee_info_temp.fee_inter := 0.00;   
                  user_fee_info_temp.fee_inter_long := 0.00;   
                  user_fee_info_temp.fee_cmnet := 0.00;   
                  user_fee_info_temp.fee_trust := 0.00;   
                  user_fee_info_temp.fee_ptp_sms := 0.00;   
                  user_fee_info_temp.fee_mms := 0.00;   
                  user_fee_info_temp.fee_magazine := 0.00;   
                  user_fee_info_temp.fee_gprs := 0.00;   
                  user_fee_info_temp.fee_wap := 0.00;   
                  user_fee_info_temp.fee_data_month := 0.00;   
                  user_fee_info_temp.fee_data := 0.00;   
                  user_fee_info_temp.fee_ring := 0.00;   
                  user_fee_info_temp.fee_display := 0.00;   
                  user_fee_info_temp.fee_ext := 0.00;   
                  user_fee_info_temp.fee_other := 0.00;   
                  user_fee_info_temp.fee_all := 0.00;   
                  user_fee_info_temp.fee_for_others := 0.00;   
                  user_fee_info_temp.fee_by_others := 0.00;   
                end;   
                
                --保存到user_fee_info,day_fee_info表   
                select seq_user_fee_info.nextval into user_fee_info_nextval from dual;   
                insert into user_fee_info(fee_id,user_id,fee_base,fee_pkg_month,fee_keep,fee_oth_month,fee_vpn,   
                fee_shift,fee_local,fee_long,fee_inprov,fee_inprov_long,fee_outprov,fee_outprov_long,fee_inter,fee_inter_long,   
                fee_cmnet,fee_trust,fee_ptp_sms,fee_mms,fee_magazine,fee_gprs,fee_wap,fee_data_month,   
                fee_data,fee_ring,fee_display,fee_ext,fee_other,fee_all,fee_for_others,fee_by_others)   
                values(   
                user_fee_info_nextval,base_fee.user_id,   
                decode(sign(base_fee.fee_base-user_fee_info_temp.fee_base),1,base_fee.fee_base-user_fee_info_temp.fee_base,0.00),   
                decode(sign(base_fee.fee_pkg_month-user_fee_info_temp.fee_pkg_month),1,base_fee.fee_pkg_month-user_fee_info_temp.fee_pkg_month,0.00),   
                decode(sign(base_fee.fee_keep-user_fee_info_temp.fee_keep),1,base_fee.fee_keep-user_fee_info_temp.fee_keep,0.00),    
                decode(sign(base_fee.fee_oth_month-user_fee_info_temp.fee_oth_month),1,base_fee.fee_oth_month-user_fee_info_temp.fee_oth_month,0.00),     
                decode(sign(base_fee.fee_vpn-user_fee_info_temp.fee_vpn),1,base_fee.fee_vpn-user_fee_info_temp.fee_vpn,0.00),      
                decode(sign(base_fee.fee_shift-user_fee_info_temp.fee_shift),1,base_fee.fee_shift-user_fee_info_temp.fee_shift,0.00),       
                decode(sign(base_fee.fee_local-user_fee_info_temp.fee_local),1,base_fee.fee_local-user_fee_info_temp.fee_local,0.00),       
                decode(sign(base_fee.fee_long-user_fee_info_temp.fee_long),1,base_fee.fee_long-user_fee_info_temp.fee_long,0.00),       
                decode(sign(base_fee.fee_inprov-user_fee_info_temp.fee_inprov),1,base_fee.fee_inprov-user_fee_info_temp.fee_inprov,0.00),       
                decode(sign(base_fee.fee_inprov_long-user_fee_info_temp.fee_inprov_long),1,base_fee.fee_inprov_long-user_fee_info_temp.fee_inprov_long,0.00),       
                decode(sign(base_fee.fee_outprov-user_fee_info_temp.fee_outprov),1,base_fee.fee_outprov-user_fee_info_temp.fee_outprov,0.00),       
                decode(sign(base_fee.fee_outprov_long-user_fee_info_temp.fee_outprov_long),1,base_fee.fee_outprov_long-user_fee_info_temp.fee_outprov_long,0.00),       
                decode(sign(base_fee.fee_inter-user_fee_info_temp.fee_inter),1,base_fee.fee_inter-user_fee_info_temp.fee_inter,0.00),       
                decode(sign(base_fee.fee_inter_long-user_fee_info_temp.fee_inter_long),1,base_fee.fee_inter_long-user_fee_info_temp.fee_inter_long,0.00),        
                decode(sign(base_fee.fee_cmnet-user_fee_info_temp.fee_cmnet),1,base_fee.fee_cmnet-user_fee_info_temp.fee_cmnet,0.00),         
                decode(sign(base_fee.fee_trust-user_fee_info_temp.fee_trust),1,base_fee.fee_trust-user_fee_info_temp.fee_trust,0.00),          
                decode(sign(base_fee.fee_ptp_sms-user_fee_info_temp.fee_ptp_sms),1,base_fee.fee_ptp_sms-user_fee_info_temp.fee_ptp_sms,0.00),           
                decode(sign(base_fee.fee_mms-user_fee_info_temp.fee_mms),1,base_fee.fee_mms-user_fee_info_temp.fee_mms,0.00),            
                decode(sign(base_fee.fee_magazine-user_fee_info_temp.fee_magazine),1,base_fee.fee_magazine-user_fee_info_temp.fee_magazine,0.00),             
                decode(sign(base_fee.fee_gprs-user_fee_info_temp.fee_gprs),1,base_fee.fee_gprs-user_fee_info_temp.fee_gprs,0.00),             
                decode(sign(base_fee.fee_wap-user_fee_info_temp.fee_wap),1,base_fee.fee_wap-user_fee_info_temp.fee_wap,0.00),              
                decode(sign(base_fee.fee_data_month-user_fee_info_temp.fee_data_month),1,base_fee.fee_data_month-user_fee_info_temp.fee_data_month,0.00),               
                decode(sign(base_fee.fee_data-user_fee_info_temp.fee_data),1,base_fee.fee_data-user_fee_info_temp.fee_data,0.00),                 
                decode(sign(base_fee.fee_ring-user_fee_info_temp.fee_ring),1,base_fee.fee_ring-user_fee_info_temp.fee_ring,0.00),                  
                decode(sign(base_fee.fee_display-user_fee_info_temp.fee_display),1,base_fee.fee_display-user_fee_info_temp.fee_display,0.00),                  
                decode(sign(base_fee.fee_ext-user_fee_info_temp.fee_ext),1,base_fee.fee_ext-user_fee_info_temp.fee_ext,0.00),                  
                decode(sign(base_fee.fee_other-user_fee_info_temp.fee_other),1,base_fee.fee_other-user_fee_info_temp.fee_other,0.00),                   
                decode(sign(base_fee.fee_all-user_fee_info_temp.fee_all),1,base_fee.fee_all-user_fee_info_temp.fee_all,0.00),                   
                decode(sign(base_fee.fee_for_others-user_fee_info_temp.fee_for_others),1,base_fee.fee_for_others-user_fee_info_temp.fee_for_others,0.00),                   
                decode(sign(base_fee.fee_by_others-user_fee_info_temp.fee_by_others),1,base_fee.fee_by_others-user_fee_info_temp.fee_by_others,0.00) );   
                
                insert into day_fee_info(id,fee_id,start_time) values(seq_day_fee_info.nextval,user_fee_info_nextval,sysdate-1);   
                   
                commit;   
                exception when others then  
                  rollback;   
                  dbms_output.put_line('保存到user_fee_info,day_fee_info表出现了异常');   
                end;   
                ------------------(end)保存到user_fee_info,day_fee_info表----------------------------------   
                
               
                
                
                  
                ----------------(begin)保存到user_fee_info,month_fee_info表----------------------   
                begin  
                   
                begin  
                ----首先删除再更新原来的user_fee_info,month_fee_info   
                  
                select a.fee_id  into v_fee_id  from month_fee_info a, user_fee_info b where a.fee_id = b.fee_id and b.user_id = base_fee.user_id   and to_char(a.start_time,'yyyy-mm') = to_char(sysdate,'yyyy-mm') ;   
                delete from user_fee_info x where x.fee_id = v_fee_id;   
                delete from month_fee_info y where y.fee_id = v_fee_id;    
                commit;   
                exception when others then  
                  rollback;   
                end;   
                 
                
                ----插入新的数据   
                select seq_user_fee_info.nextval into user_fee_info_nextval from dual;   
                insert into user_fee_info(fee_id,user_id,fee_base,fee_pkg_month,fee_keep,fee_oth_month,fee_vpn,   
                fee_shift,fee_local,fee_long,fee_inprov,fee_inprov_long,fee_outprov,fee_outprov_long,fee_inter,fee_inter_long,   
                fee_cmnet,fee_trust,fee_ptp_sms,fee_mms,fee_magazine,fee_gprs,fee_wap,fee_data_month,   
                fee_data,fee_ring,fee_display,fee_ext,fee_other,fee_all,fee_for_others,fee_by_others)   
                values( user_fee_info_nextval,base_fee.user_id, base_fee.fee_base, base_fee.fee_pkg_month,   
                base_fee.fee_keep, base_fee.fee_oth_month, base_fee.fee_vpn,   
                base_fee.fee_shift, base_fee.fee_local, base_fee.fee_long, base_fee.fee_inprov,   
                base_fee.fee_inprov_long, base_fee.fee_outprov, base_fee.fee_outprov_long,   
                base_fee.fee_inter, base_fee.fee_inter_long, base_fee.fee_cmnet,   
                base_fee.fee_trust, base_fee.fee_ptp_sms,  base_fee.fee_mms,   
                base_fee.fee_magazine,  base_fee.fee_gprs,  base_fee.fee_wap,   
                base_fee.fee_data_month,  base_fee.fee_data,  base_fee.fee_ring,   
                base_fee.fee_display, base_fee.fee_ext,  base_fee.fee_other,   
                base_fee.fee_all,  base_fee.fee_for_others, base_fee.fee_by_others);   
               
                insert into month_fee_info(id,fee_id,start_time) values(seq_month_fee_info.nextval,user_fee_info_nextval,sysdate);   
                   
                commit;   
                exception when others then  
                  rollback;   
                  dbms_output.put_line('保存到user_fee_info,month_fee_info表出现了异常');   
                end;    
                ----------------(end)保存到user_fee_info,month_fee_info表----------------------        
  
              end if;   
              
              
                  
                 
                  
            end loop;    
          end if;   
             
             
              
        exception when others then  
          --回滚数据   
          rollback;   
          dbms_output.put_line('首先通过虚拟号码,获取对应的SIM号码出现了异常!');   
        end;   
      end if;     
            
            
      --如果是真实号码,并且没有附属虚拟号码,则直接更新day_fee_info,month_fee_info表   
      if group_sims_info.simtype > 0 and (group_sims_info.groupsim is null or length(group_sims_info.groupsim) = 0 ) then  
        begin  
           --首先获取该用户每日消费记录,如果今天刚好是1号,那么获取到的数据刚好是上个月1-30号的总和   
           --如果不是1号,那么获取到的是本月前几天的总和   
           pkg_gps_audit.proc_get_userfee(func_get_user_id(group_sims_info.sim),base_fee);   
              
           --判断当前日期是否是每月1号   
           is_first_day := func_is_first_day();   
           if is_first_day = 1 then    
             ----------------------(begin)-------------------    
             begin  
                
             begin  
               --计算出上个月的总和   
               select  user_id,   
               sum(fee_base),sum(fee_pkg_month),sum(fee_keep),sum(fee_oth_month),sum(fee_vpn),   
               sum(fee_shift),sum(fee_local),sum(fee_long),sum(fee_inprov),sum(fee_inprov_long),   
               sum(fee_outprov),sum(fee_outprov_long),sum(fee_inter),sum(fee_inter_long),   
               sum(fee_cmnet),sum(fee_trust),sum(fee_ptp_sms),sum(fee_mms),sum(fee_magazine),   
               sum(fee_gprs),sum(fee_wap),sum(fee_data_month),   
               sum(fee_data),sum(fee_ring),sum(fee_display),sum(fee_ext),sum(fee_other),   
               sum(fee_all),sum(fee_for_others),sum(fee_by_others)    
               into user_fee_info_temp from user_fee_info   
               where user_id = func_get_user_id(group_sims_info.sim)   
               and fee_id in (select fee_id from day_fee_info where to_char(start_time,'yyyy-mm') = to_char(add_months(sysdate,-1),'yyyy-mm'))     
               group by user_id ;   
                
             exception when others then  
                  user_fee_info_temp.user_id := base_fee.user_id;   
                  user_fee_info_temp.fee_base := 0.00;   
                  user_fee_info_temp.fee_pkg_month := 0.00;   
                  user_fee_info_temp.fee_keep := 0.00;   
                  user_fee_info_temp.fee_oth_month := 0.00;   
                  user_fee_info_temp.fee_vpn := 0.00;   
                  user_fee_info_temp.fee_shift := 0.00;   
                  user_fee_info_temp.fee_local := 0.00;   
                  user_fee_info_temp.fee_long := 0.00;   
                  user_fee_info_temp.fee_inprov := 0.00;   
                  user_fee_info_temp.fee_inprov_long := 0.00;   
                  user_fee_info_temp.fee_outprov := 0.00;   
                  user_fee_info_temp.fee_outprov_long := 0.00;   
                  user_fee_info_temp.fee_inter := 0.00;   
                  user_fee_info_temp.fee_inter_long := 0.00;   
                  user_fee_info_temp.fee_cmnet := 0.00;   
                  user_fee_info_temp.fee_trust := 0.00;   
                  user_fee_info_temp.fee_ptp_sms := 0.00;   
                  user_fee_info_temp.fee_mms := 0.00;   
                  user_fee_info_temp.fee_magazine := 0.00;   
                  user_fee_info_temp.fee_gprs := 0.00;   
                  user_fee_info_temp.fee_wap := 0.00;   
                  user_fee_info_temp.fee_data_month := 0.00;   
                  user_fee_info_temp.fee_data := 0.00;   
                  user_fee_info_temp.fee_ring := 0.00;   
                  user_fee_info_temp.fee_display := 0.00;   
                  user_fee_info_temp.fee_ext := 0.00;   
                  user_fee_info_temp.fee_other := 0.00;   
                  user_fee_info_temp.fee_all := 0.00;   
                  user_fee_info_temp.fee_for_others := 0.00;   
                  user_fee_info_temp.fee_by_others := 0.00;   
                end;   
                
             --保存到user_fee_info,day_fee_info表   
             select seq_user_fee_info.nextval into user_fee_info_nextval from dual;   
             insert into user_fee_info(fee_id,user_id,fee_base,fee_pkg_month,fee_keep,fee_oth_month,fee_vpn,   
             fee_shift,fee_local,fee_long,fee_inprov,fee_inprov_long,fee_outprov,fee_outprov_long,fee_inter,fee_inter_long,   
             fee_cmnet,fee_trust,fee_ptp_sms,fee_mms,fee_magazine,fee_gprs,fee_wap,fee_data_month,   
             fee_data,fee_ring,fee_display,fee_ext,fee_other,fee_all,fee_for_others,fee_by_others)   
             values(   
             user_fee_info_nextval,base_fee.user_id,   
             decode(sign(base_fee.fee_base-user_fee_info_temp.fee_base),1,base_fee.fee_base-user_fee_info_temp.fee_base,0.00),   
             decode(sign(base_fee.fee_pkg_month-user_fee_info_temp.fee_pkg_month),1,base_fee.fee_pkg_month-user_fee_info_temp.fee_pkg_month,0.00),   
             decode(sign(base_fee.fee_keep-user_fee_info_temp.fee_keep),1,base_fee.fee_keep-user_fee_info_temp.fee_keep,0.00),    
             decode(sign(base_fee.fee_oth_month-user_fee_info_temp.fee_oth_month),1,base_fee.fee_oth_month-user_fee_info_temp.fee_oth_month,0.00),     
             decode(sign(base_fee.fee_vpn-user_fee_info_temp.fee_vpn),1,base_fee.fee_vpn-user_fee_info_temp.fee_vpn,0.00),      
             decode(sign(base_fee.fee_shift-user_fee_info_temp.fee_shift),1,base_fee.fee_shift-user_fee_info_temp.fee_shift,0.00),       
             decode(sign(base_fee.fee_local-user_fee_info_temp.fee_local),1,base_fee.fee_local-user_fee_info_temp.fee_local,0.00),       
             decode(sign(base_fee.fee_long-user_fee_info_temp.fee_long),1,base_fee.fee_long-user_fee_info_temp.fee_long,0.00),       
             decode(sign(base_fee.fee_inprov-user_fee_info_temp.fee_inprov),1,base_fee.fee_inprov-user_fee_info_temp.fee_inprov,0.00),       
             decode(sign(base_fee.fee_inprov_long-user_fee_info_temp.fee_inprov_long),1,base_fee.fee_inprov_long-user_fee_info_temp.fee_inprov_long,0.00),       
             decode(sign(base_fee.fee_outprov-user_fee_info_temp.fee_outprov),1,base_fee.fee_outprov-user_fee_info_temp.fee_outprov,0.00),       
             decode(sign(base_fee.fee_outprov_long-user_fee_info_temp.fee_outprov_long),1,base_fee.fee_outprov_long-user_fee_info_temp.fee_outprov_long,0.00),       
             decode(sign(base_fee.fee_inter-user_fee_info_temp.fee_inter),1,base_fee.fee_inter-user_fee_info_temp.fee_inter,0.00),       
             decode(sign(base_fee.fee_inter_long-user_fee_info_temp.fee_inter_long),1,base_fee.fee_inter_long-user_fee_info_temp.fee_inter_long,0.00),        
             decode(sign(base_fee.fee_cmnet-user_fee_info_temp.fee_cmnet),1,base_fee.fee_cmnet-user_fee_info_temp.fee_cmnet,0.00),         
             decode(sign(base_fee.fee_trust-user_fee_info_temp.fee_trust),1,base_fee.fee_trust-user_fee_info_temp.fee_trust,0.00),          
             decode(sign(base_fee.fee_ptp_sms-user_fee_info_temp.fee_ptp_sms),1,base_fee.fee_ptp_sms-user_fee_info_temp.fee_ptp_sms,0.00),           
             decode(sign(base_fee.fee_mms-user_fee_info_temp.fee_mms),1,base_fee.fee_mms-user_fee_info_temp.fee_mms,0.00),            
             decode(sign(base_fee.fee_magazine-user_fee_info_temp.fee_magazine),1,base_fee.fee_magazine-user_fee_info_temp.fee_magazine,0.00),             
             decode(sign(base_fee.fee_gprs-user_fee_info_temp.fee_gprs),1,base_fee.fee_gprs-user_fee_info_temp.fee_gprs,0.00),             
             decode(sign(base_fee.fee_wap-user_fee_info_temp.fee_wap),1,base_fee.fee_wap-user_fee_info_temp.fee_wap,0.00),              
             decode(sign(base_fee.fee_data_month-user_fee_info_temp.fee_data_month),1,base_fee.fee_data_month-user_fee_info_temp.fee_data_month,0.00),               
             decode(sign(base_fee.fee_data-user_fee_info_temp.fee_data),1,base_fee.fee_data-user_fee_info_temp.fee_data,0.00),                 
             decode(sign(base_fee.fee_ring-user_fee_info_temp.fee_ring),1,base_fee.fee_ring-user_fee_info_temp.fee_ring,0.00),                  
             decode(sign(base_fee.fee_display-user_fee_info_temp.fee_display),1,base_fee.fee_display-user_fee_info_temp.fee_display,0.00),                  
             decode(sign(base_fee.fee_ext-user_fee_info_temp.fee_ext),1,base_fee.fee_ext-user_fee_info_temp.fee_ext,0.00),                  
             decode(sign(base_fee.fee_other-user_fee_info_temp.fee_other),1,base_fee.fee_other-user_fee_info_temp.fee_other,0.00),                   
             decode(sign(base_fee.fee_all-user_fee_info_temp.fee_all),1,base_fee.fee_all-user_fee_info_temp.fee_all,0.00),                   
             decode(sign(base_fee.fee_for_others-user_fee_info_temp.fee_for_others),1,base_fee.fee_for_others-user_fee_info_temp.fee_for_others,0.00),                   
             decode(sign(base_fee.fee_by_others-user_fee_info_temp.fee_by_others),1,base_fee.fee_by_others-user_fee_info_temp.fee_by_others,0.00) );   
                
             insert into day_fee_info(id,fee_id,start_time) values(seq_day_fee_info.nextval,user_fee_info_nextval,sysdate-1);   
                
             commit;   
             exception when others then  
               rollback;   
               dbms_output.put_line('保存到user_fee_info,day_fee_info表出现了异常');   
             end;   
             ------------------(end)-------------------------------    
                
                
             -------------------(begin)-----------------------------------------   
             begin  
                
             --保存到user_fee_info,month_fee_info表   
             begin  
               ----首先删除再更新原来的user_fee_info,month_fee_info   
                    
                select a.fee_id into v_fee_id  from month_fee_info a, user_fee_info b where a.fee_id = b.fee_id and b.user_id = base_fee.user_id   and to_char(a.start_time,'yyyy-mm') = to_char(add_months(sysdate,-1),'yyyy-mm') ;   
                delete from user_fee_info x where x.fee_id = v_fee_id;   
                delete from month_fee_info y where y.fee_id = fee_id;   
                commit;   
                    
                   
             exception when others then  
               rollback;   
             end;   
                
             ----插入新的数据   
             select seq_user_fee_info.nextval into user_fee_info_nextval from dual;   
             insert into user_fee_info(fee_id,user_id,fee_base,fee_pkg_month,fee_keep,fee_oth_month,fee_vpn,   
             fee_shift,fee_local,fee_long,fee_inprov,fee_inprov_long,fee_outprov,fee_outprov_long,fee_inter,fee_inter_long,   
             fee_cmnet,fee_trust,fee_ptp_sms,fee_mms,fee_magazine,fee_gprs,fee_wap,fee_data_month,   
             fee_data,fee_ring,fee_display,fee_ext,fee_other,fee_all,fee_for_others,fee_by_others)   
             values( user_fee_info_nextval,base_fee.user_id, base_fee.fee_base, base_fee.fee_pkg_month,   
             base_fee.fee_keep, base_fee.fee_oth_month, base_fee.fee_vpn,   
             base_fee.fee_shift, base_fee.fee_local, base_fee.fee_long, base_fee.fee_inprov,   
             base_fee.fee_inprov_long, base_fee.fee_outprov, base_fee.fee_outprov_long,   
             base_fee.fee_inter, base_fee.fee_inter_long, base_fee.fee_cmnet,   
             base_fee.fee_trust, base_fee.fee_ptp_sms,  base_fee.fee_mms,   
             base_fee.fee_magazine,  base_fee.fee_gprs,  base_fee.fee_wap,   
             base_fee.fee_data_month,  base_fee.fee_data,  base_fee.fee_ring,   
             base_fee.fee_display, base_fee.fee_ext,  base_fee.fee_other,   
             base_fee.fee_all,  base_fee.fee_for_others, base_fee.fee_by_others);   
               
             insert into month_fee_info(id,fee_id,start_time) values(seq_month_fee_info.nextval,user_fee_info_nextval,sysdate-1);        
             commit;   
             exception when others then  
               rollback;   
               dbms_output.put_line('保存到user_fee_info,month_fee_info表出现了异常');   
             end;   
             ----------------------(end)-----------------------------------------------    
                 
           else --不是本月第一天   
             ------------------------(begin)-------------------------------------   
             begin  
             --保存到user_fee_info,day_fee_info表   
                
             begin  
             --计算出本月的总和   
               select  user_id,   
               sum(fee_base),sum(fee_pkg_month),sum(fee_keep),sum(fee_oth_month),sum(fee_vpn),   
               sum(fee_shift),sum(fee_local),sum(fee_long),sum(fee_inprov),sum(fee_inprov_long),   
               sum(fee_outprov),sum(fee_outprov_long),sum(fee_inter),sum(fee_inter_long),   
               sum(fee_cmnet),sum(fee_trust),sum(fee_ptp_sms),sum(fee_mms),sum(fee_magazine),   
               sum(fee_gprs),sum(fee_wap),sum(fee_data_month),   
               sum(fee_data),sum(fee_ring),sum(fee_display),sum(fee_ext),sum(fee_other),   
               sum(fee_all),sum(fee_for_others),sum(fee_by_others)    
               into user_fee_info_temp from user_fee_info   
               where user_id = func_get_user_id(group_sims_info.sim)   
               and fee_id in (select fee_id from day_fee_info where to_char(start_time,'yyyy-mm') = to_char(sysdate,'yyyy-mm'))    
               group by user_id ;   
                  
             exception when others then  
                  user_fee_info_temp.user_id := base_fee.user_id;   
                     
                  user_fee_info_temp.fee_base := 0.00;   
                  user_fee_info_temp.fee_pkg_month := 0.00;   
                  user_fee_info_temp.fee_keep := 0.00;   
                  user_fee_info_temp.fee_oth_month := 0.00;   
                  user_fee_info_temp.fee_vpn := 0.00;   
                  user_fee_info_temp.fee_shift := 0.00;   
                  user_fee_info_temp.fee_local := 0.00;   
                  user_fee_info_temp.fee_long := 0.00;   
                  user_fee_info_temp.fee_inprov := 0.00;   
                  user_fee_info_temp.fee_inprov_long := 0.00;   
                  user_fee_info_temp.fee_outprov := 0.00;   
                  user_fee_info_temp.fee_outprov_long := 0.00;   
                  user_fee_info_temp.fee_inter := 0.00;   
                  user_fee_info_temp.fee_inter_long := 0.00;   
                  user_fee_info_temp.fee_cmnet := 0.00;   
                  user_fee_info_temp.fee_trust := 0.00;   
                  user_fee_info_temp.fee_ptp_sms := 0.00;   
                  user_fee_info_temp.fee_mms := 0.00;   
                  user_fee_info_temp.fee_magazine := 0.00;   
                  user_fee_info_temp.fee_gprs := 0.00;   
                  user_fee_info_temp.fee_wap := 0.00;   
                  user_fee_info_temp.fee_data_month := 0.00;   
                  user_fee_info_temp.fee_data := 0.00;   
                  user_fee_info_temp.fee_ring := 0.00;   
                  user_fee_info_temp.fee_display := 0.00;   
                  user_fee_info_temp.fee_ext := 0.00;   
                  user_fee_info_temp.fee_other := 0.00;   
                  user_fee_info_temp.fee_all := 0.00;   
                  user_fee_info_temp.fee_for_others := 0.00;   
                  user_fee_info_temp.fee_by_others := 0.00;   
                end;   
                   
             --保存到user_fee_info,day_fee_info表   
             select seq_user_fee_info.nextval into user_fee_info_nextval from dual;   
             insert into user_fee_info(fee_id,user_id,fee_base,fee_pkg_month,fee_keep,fee_oth_month,fee_vpn,   
             fee_shift,fee_local,fee_long,fee_inprov,fee_inprov_long,fee_outprov,fee_outprov_long,fee_inter,fee_inter_long,   
             fee_cmnet,fee_trust,fee_ptp_sms,fee_mms,fee_magazine,fee_gprs,fee_wap,fee_data_month,   
             fee_data,fee_ring,fee_display,fee_ext,fee_other,fee_all,fee_for_others,fee_by_others)   
             values(   
             user_fee_info_nextval,base_fee.user_id,   
             decode(sign(base_fee.fee_base-user_fee_info_temp.fee_base),1,base_fee.fee_base-user_fee_info_temp.fee_base,0.00),   
             decode(sign(base_fee.fee_pkg_month-user_fee_info_temp.fee_pkg_month),1,base_fee.fee_pkg_month-user_fee_info_temp.fee_pkg_month,0.00),   
             decode(sign(base_fee.fee_keep-user_fee_info_temp.fee_keep),1,base_fee.fee_keep-user_fee_info_temp.fee_keep,0.00),    
             decode(sign(base_fee.fee_oth_month-user_fee_info_temp.fee_oth_month),1,base_fee.fee_oth_month-user_fee_info_temp.fee_oth_month,0.00),     
             decode(sign(base_fee.fee_vpn-user_fee_info_temp.fee_vpn),1,base_fee.fee_vpn-user_fee_info_temp.fee_vpn,0.00),      
             decode(sign(base_fee.fee_shift-user_fee_info_temp.fee_shift),1,base_fee.fee_shift-user_fee_info_temp.fee_shift,0.00),       
             decode(sign(base_fee.fee_local-user_fee_info_temp.fee_local),1,base_fee.fee_local-user_fee_info_temp.fee_local,0.00),       
             decode(sign(base_fee.fee_long-user_fee_info_temp.fee_long),1,base_fee.fee_long-user_fee_info_temp.fee_long,0.00),       
             decode(sign(base_fee.fee_inprov-user_fee_info_temp.fee_inprov),1,base_fee.fee_inprov-user_fee_info_temp.fee_inprov,0.00),       
             decode(sign(base_fee.fee_inprov_long-user_fee_info_temp.fee_inprov_long),1,base_fee.fee_inprov_long-user_fee_info_temp.fee_inprov_long,0.00),       
             decode(sign(base_fee.fee_outprov-user_fee_info_temp.fee_outprov),1,base_fee.fee_outprov-user_fee_info_temp.fee_outprov,0.00),       
             decode(sign(base_fee.fee_outprov_long-user_fee_info_temp.fee_outprov_long),1,base_fee.fee_outprov_long-user_fee_info_temp.fee_outprov_long,0.00),       
             decode(sign(base_fee.fee_inter-user_fee_info_temp.fee_inter),1,base_fee.fee_inter-user_fee_info_temp.fee_inter,0.00),       
             decode(sign(base_fee.fee_inter_long-user_fee_info_temp.fee_inter_long),1,base_fee.fee_inter_long-user_fee_info_temp.fee_inter_long,0.00),        
             decode(sign(base_fee.fee_cmnet-user_fee_info_temp.fee_cmnet),1,base_fee.fee_cmnet-user_fee_info_temp.fee_cmnet,0.00),         
             decode(sign(base_fee.fee_trust-user_fee_info_temp.fee_trust),1,base_fee.fee_trust-user_fee_info_temp.fee_trust,0.00),          
             decode(sign(base_fee.fee_ptp_sms-user_fee_info_temp.fee_ptp_sms),1,base_fee.fee_ptp_sms-user_fee_info_temp.fee_ptp_sms,0.00),           
             decode(sign(base_fee.fee_mms-user_fee_info_temp.fee_mms),1,base_fee.fee_mms-user_fee_info_temp.fee_mms,0.00),            
             decode(sign(base_fee.fee_magazine-user_fee_info_temp.fee_magazine),1,base_fee.fee_magazine-user_fee_info_temp.fee_magazine,0.00),             
             decode(sign(base_fee.fee_gprs-user_fee_info_temp.fee_gprs),1,base_fee.fee_gprs-user_fee_info_temp.fee_gprs,0.00),             
             decode(sign(base_fee.fee_wap-user_fee_info_temp.fee_wap),1,base_fee.fee_wap-user_fee_info_temp.fee_wap,0.00),              
             decode(sign(base_fee.fee_data_month-user_fee_info_temp.fee_data_month),1,base_fee.fee_data_month-user_fee_info_temp.fee_data_month,0.00),               
             decode(sign(base_fee.fee_data-user_fee_info_temp.fee_data),1,base_fee.fee_data-user_fee_info_temp.fee_data,0.00),                 
             decode(sign(base_fee.fee_ring-user_fee_info_temp.fee_ring),1,base_fee 

 

posted @ 2017-03-22 15:25  一二山人  阅读(215)  评论(0)    收藏  举报