oracle --客户报代表细

接口分析sql


返回结构spa


效果图code


存储过程接口

create or replace procedure sp_getcustomersum(i_oprtAcc      in t_customer.oprt_acc%type, --操做帐号
                                              i_zoneId       in t_zone.zone_id%type, --区域id
                                              i_fchsId       in t_franchiser.fchs_id%type, --经销商id
                                              i_storeId      in t_store.store_id%type, --门店id
                                              i_dateFlag     in char, --日期标志 0:月份 1:年份 2:区间
                                              i_date         in char, --日期
                                              i_startTime    in char, --开始时间
                                              i_endTime      in char, --结束时间
                                              o_resultCursor out sys_refcursor, --返回消息
                                              o_errorNumber  out integer) --错误码
 is
  --当前年                                             
  l_currentYear char(4);
  --xx之前客户总量
  l_allCounts integer;
  l_exception exception;

  --检查帐号异常
  l_exceptionAccount exception;
  --错误消息
  l_error_msg varchar2(100);

  /**********
  *creater:       lxl
  *craeateTime:   2015-07-15
  *function:      得到客户信息明细
  **********/
begin
  pkg_utility.sp_writeLog(i_log_type => 'INFO',
                          i_acc_id   => i_oprtAcc,
                          i_sp_name  => 'sp_getcustomersum',
                          i_log_desc => '开始');

  --这里先调用下级联检查存储过程,看帐号是否可用
  sp_checkaccount(i_account => i_oprtAcc, o_errNumber => o_errorNumber);

  --帐号不可用,直接退出
  if o_errorNumber != 0 then
    --异常处理
    raise l_exceptionAccount;
  end if;

  --初始化状态值
  o_errorNumber := pkg_constants.C_RTN_SUCCESS;
  l_error_msg   := '';

  --取系统年份
  select to_char(sysdate, 'YYYY') into l_currentYear from dual;

  --须要对dateFlag进行判空
  --检测到异常时,须要对输出值进行设置
  if i_dateFlag is null then
    raise l_exception;
  end if;

  --1.i_dateFlag = 0,初始化进来显示当年12个月的客户量
  if i_dateFlag = 0 then
    begin
      --1.先根据i_date计算出i_date以前全部的客户量
      select nvl(count(*),0)
        into l_allCounts
        from t_customer tc
       where tc.add_date < i_date || '0101';
      --2.再将结果相加返回给前台
      open o_resultCursor for
        select rownum,
               ny,
               sumCs,
               cstmAllNum,
               max(sumCs) over() as maxSumCs,
               min(sumCs) over() as minSumCs,
               max(cstmAllNum) over() as maxCstmAllNum,
               min(cstmAllNum) over() as minCstmAllNum
          from (select rownum,
                       ny,
                       sumCs,
                       (sum(sumCs) over(order by ny) + l_allCounts) as cstmAllNum
                  from (select nvl(substr(tc.add_date, 0, 6),0) as ny,
                               nvl(count(tc.cstm_id),0) as sumCs
                          from t_customer tc
                         where substr(tc.add_date, 0, 4) = i_date
                              --带上区域id
                           and (trim(i_zoneId) is null or
                                tc.zone_id = i_zoneId)
                              --带上经销商id
                           and (trim(i_fchsId) is null or
                                tc.fchs_id = i_fchsId)
                              --带上门店id
                           and (trim(i_storeId) is null or
                                tc.store_id = i_storeId)
                         group by substr(tc.add_date, 0, 6))
                 order by ny);
    
      --加缺陷判断
    exception
      when others then
        raise l_exception;
    end;
  end if; --end i_dateFlag = 0

  --2.i_dateFlag = 1,查询当年前6年的数据
  --按照年来分组
  if i_dateFlag = 1 then
    begin
      --1.先计算出(l_currentYear - i_date + 1) || '0101以前的客户量
      select nvl(count(*),0)
        into l_allCounts
        from t_customer tc
       where tc.add_date < (l_currentYear - i_date + 1) || '0101';
      --2.再将结果相加返回给前台
      open o_resultCursor for
        select rownum,
               ny,
               sumCs,
               cstmAllNum,
               max(sumCs) over() as maxSumCs,
               min(sumCs) over() as minSumCs,
               max(cstmAllNum) over() as maxCstmAllNum,
               min(cstmAllNum) over() as minCstmAllNum
          from (select rownum,
                       ny,
                       sumCs,
                       (sum(sumCs) over(order by rownum) + l_allCounts) as cstmAllNum
                  from (select nvl(substr(tc.add_date, 0, 4),0) as ny,
                               nvl(count(tc.cstm_id),0) as sumCs
                          from t_customer tc
                         where substr(tc.add_date, 0, 4) between
                               (l_currentYear - i_date + 1) and l_currentYear
                         group by substr(tc.add_date, 0, 4))
                 order by ny);
    
      --加缺陷判断
    exception
      when others then
        raise l_exception;
    end;
  end if; --end i_dateFlag = 1

  --3.i_dateFlag = 2时,只须要开始时间和结束时间
  if i_dateFlag = 2 then
    begin
      --1.先计算出i_startTime以前的客户量
      select nvl(count(*),0)
        into l_allCounts
        from t_customer tc
       where tc.add_date < i_startTime;
      --2.再将结果相加返回给前台
      open o_resultCursor for
        select rownum,
               ny,
               sumCs,
               cstmAllNum,
               max(sumCs) over() as maxSumCs,
               min(sumCs) over() as minSumCs,
               max(cstmAllNum) over() as maxCstmAllNum,
               min(cstmAllNum) over() as minCstmAllNum
          from (select rownum,
                       ny,
                       sumCs,
                       (sum(sumCs) over(order by rownum) + l_allCounts) as cstmAllNum
                  from (select nvl(substr(tc.add_date, 0, 6),0) as ny,
                               nvl(count(tc.cstm_id),0) as sumCs
                          from t_customer tc
                         where substr(tc.add_date, 0, 6) between i_startTime and
                               i_endTime
                         group by substr(tc.add_date, 0, 6))
                 order by ny);
    
      --加缺陷判断
    exception
      when others then
        raise l_exception;
    end;
  end if; --end i_dateFlag = 2

  pkg_utility.sp_writeLog(i_log_type => 'INFO',
                          i_acc_id   => i_oprtAcc,
                          i_sp_name  => 'sp_getcustomersum',
                          i_log_desc => '结束');

exception
  when l_exceptionAccount then
    --给游标赋值
    open o_resultCursor for
      select rownum,
             '' as ny,
             '' as sumCs,
             '' as cstmAllNum,
             '' as maxSumCs,
             '' as minSumCs,
             '' as maxCstmAllNum,
             '' as minCstmAllNum
        from dual
       where rownum = 1;
  when l_exception then
    o_errorNumber := PKG_CONSTANTS.C_RTN_FAILURE;
  when others then
    o_errorNumber := PKG_CONSTANTS.C_RTN_FAILURE;
    l_error_msg   := '获取客户信息明细异常';
    pkg_utility.sp_writeLog(i_log_type => 'ERROR',
                            i_acc_id   => i_oprtAcc,
                            i_sp_name  => 'sp_getcustomersum',
                            i_log_desc => l_error_msg);
end sp_getcustomersum;


结束
get

相关文章
相关标签/搜索