客户信用度后台准备

create or replace package body PG_MINER_CREDIT is

procedure P_MINER_CREDIT_MODEL_INIT    --为建模数据准备用户资料,如生成行为数据为9月,则它为5月
(
  pi_month       IN  VARCHAR2 ,
  po_RetCode     OUT VARCHAR2 ,
  po_ErrCode     OUT VARCHAR2 ,
  po_ErrMsg      OUT VARCHAR2
)
/********************************************************************************
* 函数名称: P_MINER_CREDIT_MODEL_INIT
* 功能描述: 客户信用度模型初始化
* 作    者:
* 编写日期: 200508
* 输    入:
* 输    出:
* 返 回 值:
* 修改历史:  2005-10-18
********************************************************************************/
is
  vc_premonth1 CHAR(6);
  vc_premonth2 CHAR(6);
  vc_premonth3 CHAR(6);
  vc_nextmonth1 CHAR(6);
  vc_nextmonth2 CHAR(6);
  vc_nextmonth3 CHAR(6);
  vc_nextmonth4 CHAR(6);
  vc_nextmonth5 CHAR(6);
  vc_DySql     varchar2(2000);
 
begin
  vi_Return := PG_SYS_MANAGER.F_SYS_START_LOG(0,301002,0,'客户信用度模型初始化(统计月:'||pi_month||')');
 
  SELECT to_char(add_months(to_date(pi_month,'yyyymm'),-1),'yyyymm'),
         to_char(add_months(to_date(pi_month,'yyyymm'),-2),'yyyymm'),
         to_char(add_months(to_date(pi_month,'yyyymm'),-3),'yyyymm'),
         to_char(add_months(to_date(pi_month,'yyyymm'),1),'yyyymm'),
         to_char(add_months(to_date(pi_month,'yyyymm'),2),'yyyymm'),
         to_char(add_months(to_date(pi_month,'yyyymm'),3),'yyyymm'),
         to_char(add_months(to_date(pi_month,'yyyymm'),4),'yyyymm'),
         to_char(add_months(to_date(pi_month,'yyyymm'),5),'yyyymm')
  INTO vc_premonth1,vc_premonth2,vc_premonth3,
       vc_nextmonth1,vc_nextmonth2,vc_nextmonth3,vc_nextmonth4,vc_nextmonth5
  FROM dual;
 
  EXECUTE IMMEDIATE 'truncate table T_MINER_CREDIT_USER';
  --插入第0类用户  
  INSERT INTO T_MINER_CREDIT_USER
  (subscrbid,Class)
  SELECT subscrbid,0
  FROM FACT.T_FACT_PRE_TCM_SERV_ACCT
  WHERE monpart = substr(vc_nextmonth2,5,2)
    AND arrearflag30 = '0'
  INTERSECT
  SELECT subscrbid,0
  FROM FACT.T_FACT_PRE_TCM_SERV_ACCT
  WHERE monpart = substr(vc_nextmonth1,5,2)
    AND curacctflag = '1';
  vi_count := SQL%ROWCOUNT;
  commit;
 
  --插入第1,2类用户  
  INSERT INTO T_MINER_CREDIT_USER
  (subscrbid    ,Class   )
  SELECT A.subscrbid,DECODE(OnNetUsedFlag,'1',1,'0',2,NULL)
  FROM FACT.T_FACT_PRE_TCM_SERV_ARCH A,
      (select subscrbid
       from FACT.T_FACT_PRE_TCM_SERV_ACCT
       where monpart = substr(vc_nextmonth2,5,2)
         and arrearflag30 = '1'
       minus
       select subscrbid
       from FACT.T_FACT_PRE_TCM_SERV_ACCT
       where monpart = substr(vc_nextmonth3,5,2)
         and arrearflag60 = '1') B
  WHERE A.SUBSCRBID = B.SUBSCRBID
    AND A.MONPART = substr(vc_nextmonth3,5,2);
  vi_count := vi_count + SQL%ROWCOUNT;
  commit;
 
  --插入第3,4类用户
  INSERT INTO T_MINER_CREDIT_USER
  (subscrbid ,Class)
  SELECT A.subscrbid,DECODE(OnNetUsedFlag,'1',3,'0',4,NULL)
  FROM FACT.T_FACT_PRE_TCM_SERV_ARCH A,
      (select subscrbid
       from FACT.T_FACT_PRE_TCM_SERV_ACCT
       where monpart = substr(vc_nextmonth3,5,2)
         and arrearflag60 = '1'
       minus
       select subscrbid
       from FACT.T_FACT_PRE_TCM_SERV_ACCT
       where monpart = substr(vc_nextmonth4,5,2)
         and arrearflag90 = '1') B
  WHERE A.SUBSCRBID = B.SUBSCRBID
    AND A.MONPART = substr(vc_nextmonth4,5,2);
  vi_count := vi_count + SQL%ROWCOUNT;
  commit;
 
  --插入第5,6类用户
  INSERT INTO T_MINER_CREDIT_USER
  (subscrbid    ,Class   )
  SELECT A.subscrbid,DECODE(OnNetUsedFlag,'1',5,'0',6,NULL)
  FROM FACT.T_FACT_PRE_TCM_SERV_ARCH A,
      (select subscrbid
       from FACT.T_FACT_PRE_TCM_SERV_ACCT
       where monpart = substr(vc_nextmonth4,5,2)
         and arrearflag90 = '1'
       minus
       select subscrbid
       from FACT.T_FACT_PRE_TCM_SERV_ACCT
       where monpart = substr(vc_nextmonth5,5,2)
         and arrearflag120 = '1') B
  WHERE A.SUBSCRBID = B.SUBSCRBID
    AND A.MONPART = substr(vc_nextmonth5,5,2);
  vi_count := vi_count + SQL%ROWCOUNT;
  commit;
 
  --插入第7类用户
  INSERT INTO T_MINER_CREDIT_USER
  (subscrbid    ,Class   )
  SELECT subscrbid,7
  FROM FACT.T_FACT_PRE_TCM_SERV_ACCT
  WHERE monpart = substr(vc_nextmonth1,5,2)
    AND curacctflag = '1'
  MINUS
  SELECT SUBSCRBID,7
  FROM T_MINER_CREDIT_USER;
  vi_count := vi_count + SQL%ROWCOUNT;
  commit;
   
  --更新失信概率
  UPDATE T_MINER_CREDIT_USER
  SET LoseFaithProbility =
     (select decode(class,0,0.01,1,0.9,2,0.9,3,0.94,4,0.95,5,0.96,6,0.97,7,1,null)
      from dual);
  COMMIT;
 
  EXECUTE IMMEDIATE 'truncate table T_MINER_CREDIT_TMP1';
  EXECUTE IMMEDIATE 'truncate table T_MINER_CREDIT_TMP2';
  --插入各月出帐金额
  INSERT INTO T_MINER_CREDIT_TMP2
  (subscrbid     ,acctfee1   )
  SELECT
   subscrbid     ,curacctfee
  FROM  fact.T_FACT_TM_SERV_ACCT
  WHERE monpart = substr(pi_month,5,2);
  COMMIT;
 
  INSERT INTO T_MINER_CREDIT_TMP2
  (subscrbid     ,acctfee2       )
  SELECT
   subscrbid     ,curacctfee
  FROM  fact.T_FACT_TM_SERV_ACCT
  WHERE monpart = substr(vc_premonth1,5,2);
  COMMIT;
 
  INSERT INTO T_MINER_CREDIT_TMP2
  (subscrbid     ,acctfee3       )
  SELECT
   subscrbid     ,curacctfee
  FROM  fact.T_FACT_TM_SERV_ACCT
  WHERE monpart = substr(vc_premonth2,5,2);
  COMMIT;
 
  INSERT INTO T_MINER_CREDIT_TMP2
  (subscrbid     ,acctfee4       )
  SELECT
   subscrbid     ,curacctfee
  FROM  fact.T_FACT_TM_SERV_ACCT
  WHERE monpart = substr(vc_premonth3,5,2);
  COMMIT;
 
  INSERT INTO T_MINER_CREDIT_TMP1
  (subscrbid     ,acctfee1      ,acctfee2      ,acctfee3       ,acctfee4)
  SELECT
   subscrbid     ,sum(acctfee1) ,sum(acctfee2) ,sum(acctfee3)  ,sum(acctfee4)
  FROM  T_MINER_CREDIT_TMP2
  GROUP BY subscrbid;
  COMMIT;
 
  --插入出帐比例
  UPDATE T_MINER_CREDIT_USER a
  SET (Accountchangerate1,Accountchangerate2,Accountchangerate3) =
      (select
       case when acctfee2 = 0 then 1000000 else round((acctfee1-acctfee2)/acctfee2,3) end,
       case when acctfee3 = 0 then 1000000 else round((acctfee2-acctfee3)/acctfee3,3) end,
       case when acctfee4 = 0 then 1000000 else round((acctfee3-acctfee4)/acctfee4,3) end
       from T_MINER_CREDIT_TMP1 b
       where a.subscrbid = b.subscrbid)
  WHERE subscrbid in(select subscrbid from T_MINER_CREDIT_TMP1);
  COMMIT;
 
  --插入最近一个月日通话均值/三个月日通话均值,近三个月平均出帐金额
  EXECUTE IMMEDIATE 'truncate table T_MINER_CREDIT_TMP1';
  vc_DySql :=
' INSERT INTO T_MINER_CREDIT_TMP1'||
' (SUBSCRBID  ,acctfee1   ,acctfee2    ,acctfee3    )'||
' SELECT SUBSCRBID,AveDayTimes1,AveAveDayTimes,AveTotalCharge'||
' FROM t_miner_churn_total_'||pi_month;
  EXECUTE IMMEDIATE vc_DySql;
  COMMIT;
 
  UPDATE T_MINER_CREDIT_USER a
  SET (avedaycallnumrate,AveTotalCharge) =
      (select decode(acctfee2,0,0,round(acctfee1/acctfee2,3)),acctfee3
       from T_MINER_CREDIT_TMP1 b
       where a.subscrbid = b.subscrbid);
  COMMIT;
 
  po_RetCode := '0';   
 vi_Return := PG_SYS_MANAGER.F_SYS_SUCCESS_LOG(vi_count,0,0,0);

EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        po_RetCode := '1';
        po_ErrCode := SQLCODE;
        po_ErrMsg  := SQLERRM||' || '||po_ErrMsg;
        vi_Return := PG_SYS_MANAGER.F_SYS_ERROR_LOG(0,0,0,0,'错误号:'||po_ErrCode||'  错误信息:'||po_ErrMsg);
 
end P_MINER_CREDIT_MODEL_INIT;

procedure P_MINER_CREDIT_MODEL_RESULT         --生成建模数据,9月对应5月
(
  pi_month       IN  VARCHAR2 ,
  po_RetCode     OUT VARCHAR2 ,
  po_ErrCode     OUT VARCHAR2 ,
  po_ErrMsg      OUT VARCHAR2
)
/********************************************************************************
* 函数名称: P_MINER_CREDIT_MODEL_RESULT
* 功能描述: 客户信用度模型结果数据
* 作    者:
* 编写日期: 200508
* 输    入:
* 输    出:
* 返 回 值:
* 修改历史:
********************************************************************************/
is
  vc_DySql     varchar2(4000);
 
begin
  vi_Return := PG_SYS_MANAGER.F_SYS_START_LOG(0,301003,0,'客户信用度模型结果数据(统计月:'||pi_month||')');
 
  DELETE FROM T_MINER_CREDIT_MODEL
  WHERE MONPART = substr(pi_month,5,2);
  COMMIT;
 
  vc_DySql :=
' INSERT INTO T_MINER_CREDIT_MODEL'||
' ('||
'  SUBSCRBID              ,MONPART                ,MONTH                  ,'||
'  DATUMVERIFY            ,srvgnum                ,'||
'  SPECCODE               ,SRVGPLNID              ,'||
'  USERLEVELCODE          ,INSCALLINGRELCLIENTNUM ,INSCALLEDRELCLIENTNUM  ,'||
'  OUTSCALLINGRELCLIENTNUM,OUTSCALLEDRELCLIENTNUM ,COTHRES                ,'||
'  CIOTHRES               ,CUSTAGE                ,LACKSTOPNUM            ,'||
'  AVEDAYCALLNUMRATE      ,ACCOUNTCHANGERATE1     ,ACCOUNTCHANGERATE2     ,'||
'  PAYMETHOD              ,OVERDUEAMNT            ,DEPOSITBALANCE         ,'||
'  ACCOUNTCHANGERATE3     ,AVETOTALCHARGE         ,LOSEFAITHPROBILITY     ,'||
'  CLASS                  ,TOTALCALLTIMES         ,TOTALCHARGE            ,'||
'  PLAINTTIMES            ,SHORTCALLTIMES         ,Sponsionflag           ,'||
'  ASSISTCARDNUM          ,USERDEPOSITSUM         ,CITYCALLFEERATE        ,'||
'  NATIONINSLONGFEERATE   ,NATIONOUTSLONGFEERATE  ,ADDVALUEFEERATE        ,'||
'  ROAMFEERATE            ,INNETDATE              ,CALLINGCALLEDTIMESRATE ,'||
'  TRANCALLTIMESRATE      ,innetmonths'||     
' )'||
' SELECT'||
'  b.SUBSCRBID            ,substr('''||pi_month||''',5,2),'''||pi_month||''','||
'  nvl(UserCheckType,''0''),a.srvgnum               ,'||
'  a.SPECCODE             ,SRVGPLNID              ,'||
'  USERLEVELCODE          ,nvl(INSCALLINGRELCLIENTNUM,0),nvl(INSCALLEDRELCLIENTNUM,0),'||
'  nvl(OUTSCALLINGRELCLIENTNUM,0),nvl(OUTSCALLEDRELCLIENTNUM,0),COTHRES   ,'||
'  CIOTHRES               ,CUSTAGE                ,nvl(LACKSTOPNUM,0)     ,'||
'  nvl(AVEDAYCALLNUMRATE,0),ACCOUNTCHANGERATE1    ,ACCOUNTCHANGERATE2     ,'||
'  nvl(PAYMETHOD,''999'') ,nvl(OVERDUEAMNT,0)     ,nvl(DEPOSITBALANCE,0)  ,'||
'  ACCOUNTCHANGERATE3     ,nvl(AVETOTALCHARGE,0)  ,LOSEFAITHPROBILITY     ,'||
'  CLASS                  ,nvl(TOTALCALLTIMES,0)  ,nvl(TOTALCHARGE,0)     ,'||
'  nvl(PLAINTTIMES,0)     ,nvl(SHORTCALLTIMES,0)  ,nvl(Sponsionflag,''0''),'||
'  nvl(ASSISTCARDNUM,0)   ,nvl(USERDEPOSITSUM,0)  ,nvl(CITYCALLFEERATE,0) ,'||
'  nvl(NATIONINSLONGFEERATE,0),nvl(NATIONOUTSLONGFEERATE,0),nvl(ADDVALUEFEERATE,0),'||
'  nvl(ROAMFEERATE,0)     ,INNETDATE              ,nvl(CALLINGCALLEDTIMESRATE,0),'||
'  nvl(TRANCALLTIMESRATE,0),innetmonth'||
' FROM  t_miner_churn_month_'||pi_month||' a,'||
'       T_MINER_CREDIT_USER b,'||
'       T_MINER_DATA_CHECK c'||
' WHERE a.subscrbid = b.subscrbid'||
'   AND b.subscrbid = c.subscrbid(+)'||
'   AND SrvgPlnId not in(''SZ00BY2'',''SZ00BYJ'',''SZ00BYZ'',''SZ03BY2'',''SZ03BYZ'')'||
'   AND prmtcode not in(''GSZ00042'',''GSZ00036'',''GSZ00045'',''GSZ00093'')'||
'   AND prodtcode <> ''0F''';
  EXECUTE IMMEDIATE vc_DySql;
  vi_count := SQL%ROWCOUNT;
  COMMIT;
 
  po_RetCode := '0';   
 vi_Return := PG_SYS_MANAGER.F_SYS_SUCCESS_LOG(vi_count,0,0,0);

EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        po_RetCode := '1';
        po_ErrCode := SQLCODE;
        po_ErrMsg  := SQLERRM||' || '||po_ErrMsg;
        vi_Return := PG_SYS_MANAGER.F_SYS_ERROR_LOG(0,0,0,0,'错误号:'||po_ErrCode||'  错误信息:'||po_ErrMsg);
 
end P_MINER_CREDIT_MODEL_RESULT;

procedure P_MINER_CREDIT_OPERATION        --应用数据,即事实数据
(
  pi_month       IN  VARCHAR2 ,
  po_RetCode     OUT VARCHAR2 ,
  po_ErrCode     OUT VARCHAR2 ,
  po_ErrMsg      OUT VARCHAR2
)
/********************************************************************************
* 函数名称: P_MINER_CREDIT_OPERATION
* 功能描述: 信用度生产数据
* 作    者:
* 编写日期: 200508
* 输    入:
* 输    出:
* 返 回 值:
* 修改历史:
********************************************************************************/
is
  vc_premonth1 CHAR(6);
  vc_premonth2 CHAR(6);
  vc_premonth3 CHAR(6);
  vc_DySql     varchar2(4000);
 
begin
  vi_Return := PG_SYS_MANAGER.F_SYS_START_LOG(0,301004,0,'信用度生产数据(统计月:'||pi_month||')');
 
  SELECT to_char(add_months(to_date(pi_month,'yyyymm'),-1),'yyyymm'),
         to_char(add_months(to_date(pi_month,'yyyymm'),-2),'yyyymm'),
         to_char(add_months(to_date(pi_month,'yyyymm'),-3),'yyyymm')
  INTO vc_premonth1,vc_premonth2,vc_premonth3
  FROM dual;
 
  EXECUTE IMMEDIATE 'truncate table T_MINER_CREDIT_USER';
  EXECUTE IMMEDIATE 'truncate table T_MINER_CREDIT_TMP1';
  EXECUTE IMMEDIATE 'truncate table T_MINER_CREDIT_TMP2';
 
  --插入本月出帐用户
  INSERT INTO T_MINER_CREDIT_USER
  (subscrbid    )
  SELECT subscrbid
  FROM FACT.T_FACT_PRE_TCM_SERV_ACCT
  WHERE monpart = substr(pi_month,5,2)
    AND curacctflag = '1';
  vi_count := SQL%ROWCOUNT;
  commit;
 
  --插入各月出帐金额
  INSERT INTO T_MINER_CREDIT_TMP2
  (subscrbid     ,acctfee1       )
  SELECT
   subscrbid     ,curacctfee
  FROM  fact.T_FACT_TM_SERV_ACCT
  WHERE monpart = substr(pi_month,5,2);
  COMMIT;
 
  INSERT INTO T_MINER_CREDIT_TMP2
  (subscrbid     ,acctfee2       )
  SELECT
   subscrbid     ,curacctfee
  FROM  fact.T_FACT_TM_SERV_ACCT
  WHERE monpart = substr(vc_premonth1,5,2);
  COMMIT;
 
  INSERT INTO T_MINER_CREDIT_TMP2
  (subscrbid     ,acctfee3       )
  SELECT
   subscrbid     ,curacctfee
  FROM  fact.T_FACT_TM_SERV_ACCT
  WHERE monpart = substr(vc_premonth2,5,2);
  COMMIT;
 
  INSERT INTO T_MINER_CREDIT_TMP2
  (subscrbid     ,acctfee4       )
  SELECT
   subscrbid     ,curacctfee
  FROM  fact.T_FACT_TM_SERV_ACCT
  WHERE monpart = substr(vc_premonth3,5,2);
  COMMIT;
 
  INSERT INTO T_MINER_CREDIT_TMP1
  (subscrbid     ,acctfee1      ,acctfee2      ,acctfee3       ,acctfee4)
  SELECT
   subscrbid     ,sum(acctfee1) ,sum(acctfee2) ,sum(acctfee3)  ,sum(acctfee4)
  FROM  T_MINER_CREDIT_TMP2
  GROUP BY subscrbid;
  COMMIT;
 
  --插入出帐比例
  UPDATE T_MINER_CREDIT_USER a
  SET (Accountchangerate1,Accountchangerate2,Accountchangerate3) =
      (select
       case when acctfee2 = 0 then 1000000 else round((acctfee1-acctfee2)/acctfee2,3) end,
       case when acctfee3 = 0 then 1000000 else round((acctfee2-acctfee3)/acctfee3,3) end,
       case when acctfee4 = 0 then 1000000 else round((acctfee3-acctfee4)/acctfee4,3) end
       from T_MINER_CREDIT_TMP1 b
       where a.subscrbid = b.subscrbid)
  WHERE subscrbid in(select subscrbid from T_MINER_CREDIT_TMP1);
  COMMIT;
 
  --插入最近一个月日通话均值/三个月日通话均值,近三个月平均出帐金额
  EXECUTE IMMEDIATE 'truncate table T_MINER_CREDIT_TMP1';
  vc_DySql :=
' INSERT INTO T_MINER_CREDIT_TMP1'||
' (SUBSCRBID  ,acctfee1   ,acctfee2    ,acctfee3    )'||
' SELECT SUBSCRBID,AveDayTimes1,AveAveDayTimes,AveTotalCharge'||
' FROM t_miner_churn_total_'||pi_month;
  EXECUTE IMMEDIATE vc_DySql;
  COMMIT;
 
  UPDATE T_MINER_CREDIT_USER a
  SET (avedaycallnumrate,AveTotalCharge) =
      (select decode(acctfee2,0,0,round(acctfee1/acctfee2,3)),acctfee3
       from T_MINER_CREDIT_TMP1 b
       where a.subscrbid = b.subscrbid);
  COMMIT;
 
  DELETE FROM T_MINER_CREDIT_OPERATION
  WHERE MONPART = substr(pi_month,5,2);
  COMMIT;
 
  vc_DySql :=
' INSERT INTO T_MINER_CREDIT_OPERATION'||
' ('||
'  SUBSCRBID              ,MONPART                ,MONTH                  ,'||
'  DATUMVERIFY            ,srvgnum                ,'||
'  SPECCODE               ,SRVGPLNID              ,'||
'  USERLEVELCODE          ,INSCALLINGRELCLIENTNUM ,INSCALLEDRELCLIENTNUM  ,'||
'  OUTSCALLINGRELCLIENTNUM,OUTSCALLEDRELCLIENTNUM ,COTHRES                ,'||
'  CIOTHRES               ,CUSTAGE                ,LACKSTOPNUM            ,'||
'  AVEDAYCALLNUMRATE      ,ACCOUNTCHANGERATE1     ,ACCOUNTCHANGERATE2     ,'||
'  PAYMETHOD              ,OVERDUEAMNT            ,DEPOSITBALANCE         ,'||
'  ACCOUNTCHANGERATE3     ,AVETOTALCHARGE         ,LOSEFAITHPROBILITY     ,'||
'  CLASS                  ,TOTALCALLTIMES         ,TOTALCHARGE            ,'||
'  PLAINTTIMES            ,SHORTCALLTIMES         ,SPONSIONFLAG           ,'||
'  ASSISTCARDNUM          ,USERDEPOSITSUM         ,CITYCALLFEERATE        ,'||
'  NATIONINSLONGFEERATE   ,NATIONOUTSLONGFEERATE  ,ADDVALUEFEERATE        ,'||
'  ROAMFEERATE            ,INNETDATE              ,CALLINGCALLEDTIMESRATE ,'||
'  TRANCALLTIMESRATE      ,innetmonths'||     
' )'||
' SELECT'||
'  b.SUBSCRBID            ,substr('''||pi_month||''',5,2),'''||pi_month||''','||
'  nvl(UserCheckType,''0''),a.srvgnum               ,'||
'  a.SPECCODE             ,SRVGPLNID              ,'||
'  USERLEVELCODE          ,nvl(INSCALLINGRELCLIENTNUM,0),nvl(INSCALLEDRELCLIENTNUM,0),'||
'  nvl(OUTSCALLINGRELCLIENTNUM,0),nvl(OUTSCALLEDRELCLIENTNUM,0),COTHRES   ,'||
'  CIOTHRES               ,CUSTAGE                ,nvl(LACKSTOPNUM,0)     ,'||
'  nvl(AVEDAYCALLNUMRATE,0),ACCOUNTCHANGERATE1     ,ACCOUNTCHANGERATE2     ,'||
'  nvl(PAYMETHOD,''999'') ,nvl(OVERDUEAMNT,0)     ,nvl(DEPOSITBALANCE,0)  ,'||
'  ACCOUNTCHANGERATE3     ,nvl(AVETOTALCHARGE,0)  ,LOSEFAITHPROBILITY     ,'||
'  CLASS                  ,nvl(TOTALCALLTIMES,0)  ,nvl(TOTALCHARGE,0)     ,'||
'  nvl(PLAINTTIMES,0)     ,nvl(SHORTCALLTIMES,0)  ,nvl(SPONSIONFLAG,''0''),'||
'  nvl(ASSISTCARDNUM,0)   ,nvl(USERDEPOSITSUM,0)  ,nvl(CITYCALLFEERATE,0) ,'||
'  nvl(NATIONINSLONGFEERATE,0),nvl(NATIONOUTSLONGFEERATE,0),nvl(ADDVALUEFEERATE,0),'||
'  nvl(ROAMFEERATE,0)     ,INNETDATE              ,nvl(CALLINGCALLEDTIMESRATE,0),'||
'  nvl(TRANCALLTIMESRATE,0),innetmonth'||
' FROM  t_miner_churn_month_'||pi_month||' a,'||
'       T_MINER_CREDIT_USER b,'||
'       T_MINER_DATA_CHECK c'||
' WHERE a.subscrbid = b.subscrbid'||
'   AND b.subscrbid = c.subscrbid(+)'||
'   AND SrvgPlnId not in(''SZ00BY2'',''SZ00BYJ'',''SZ00BYZ'',''SZ03BY2'',''SZ03BYZ'')'||
'   AND prmtcode not in(''GSZ00042'',''GSZ00036'',''GSZ00045'',''GSZ00093'')'||
'   AND prodtcode <> ''0F''';
  EXECUTE IMMEDIATE vc_DySql;
  vi_count := vi_count + SQL%ROWCOUNT;
  COMMIT;
 
  po_RetCode := '0';   
 vi_Return := PG_SYS_MANAGER.F_SYS_SUCCESS_LOG(vi_count,0,0,0);

EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        po_RetCode := '1';
        po_ErrCode := SQLCODE;
        po_ErrMsg  := SQLERRM||' || '||po_ErrMsg;
        vi_Return := PG_SYS_MANAGER.F_SYS_ERROR_LOG(0,0,0,0,'错误号:'||po_ErrCode||'  错误信息:'||po_ErrMsg);
 
end P_MINER_CREDIT_OPERATION;

procedure p_calc_credit_check
/********************************************************************************
* 过程名称: P_CALC_credit_USERFLAG
* 功能描述: 为用户标识表准备数据
* 作    者: 袁虎声
* 编写日期: 2005.08
* 输    入: pi_month 统计月份
* 输    出: po_RetCode '0' 成功  '1'  失败
            po_ErrCode 输出oracle的sqlcode
            po_ErrMsg  输出oracle的sqlerrm
* 返 回 值:
* 修改历史:
* 修 改 人   日  期   修改说明
  --------  --------  -----------------------------------------------------------
********************************************************************************/
(
  pi_month   IN  VARCHAR2 ,
  po_RetCode OUT VARCHAR2 ,
  po_ErrCode OUT VARCHAR2 ,
  po_ErrMsg  OUT VARCHAR2
)

is
  vi_return    NUMBER(10);      --存储过程返回值 
  vi_count     NUMBER(10);      --执行的SQL数 
  vc_DySql     VARCHAR2(2000);  --动态SQL语句
  v_i          number(1);       --循环计数器
  v_total      number;
  v_percent    number;          --选取比例 
  v_predictNum   number(13);      --选取用户数 
  v_factNum    number(13);          --实际用户数 
  v_veracity   number;          --准确率率 
  v_n          number;
  v_oweFlag    char(1);
 

begin
    
  --写开始操作数据库日志
  vi_Return := PG_SYS_MANAGER.F_SYS_START_LOG(0,301005,0,'生成挖掘数据视图('||pi_month||'月)');
 
  --删除错误数据
  vc_DySql:='DELETE FROM t_calc_credit_check WHERE CALCMONTH = '''||pi_month||'''';
  EXECUTE IMMEDIATE vc_DySql;
    
  v_n := 1;
  loop
      exit when v_n > 2; 
      case when v_n = 1 then v_oweFlag :='0';                           
           when v_n = 2 then v_oweFlag :='1';
      end case;
  
      case when v_n = 1 then
           select count(*) into v_total      
           from T_MINER_CREDIT_MODEL
           where LoseFaithProbility <= 0.01
             and Monpart = substr(pi_month,5,2);         
           when v_n = 2 then
           select count(*) into v_total      
           from T_MINER_CREDIT_MODEL
           where LoseFaithProbility > 0.01
             and Monpart = substr(pi_month,5,2);
      end case;
        
     --初始化循环次数
     v_i := 1;
     --循环统计20%、40%、60%、80%,100%这五个选取比例的准确率
     loop
       exit when v_i > 5;
      
       --计算本次循环的比例
       v_percent := 0.2 * v_i;
      
       --计算该比例的人数
       v_factNum := v_total * v_percent;
      
       --取得比例中交叉人数
       case when v_n = 1 then
            select sum(case when c.LoseFaithProbility <= 0.01
            then 1 else 0 end) into v_predictNum
            from
            ( select a.LoseFaithProbility
            from t_miner_credit_result a,T_MINER_CREDIT_MODEL b
            where b.LoseFaithProbility <= 0.01
            and a.subscrbid = b.subscrbid
            and Monpart = substr(pi_month,5,2)
            and a.calcMonth = pi_month     
            order by confidence desc,a.subscrbid desc
            ) c
            where rownum <= v_factNum;         
            when v_n = 2 then
            select sum(case when c.LoseFaithProbility > 0.01
            then 1 else 0 end) into v_predictNum
            from
            ( select a.LoseFaithProbility
            from t_miner_credit_result a,T_MINER_CREDIT_MODEL b
            where b.LoseFaithProbility > 0.01
            and a.subscrbid = b.subscrbid
            and Monpart = substr(pi_month,5,2)
            and a.calcMonth = pi_month    
            order by confidence desc,a.subscrbid desc
            ) c
            where rownum <= v_factNum;
      end case;
      
       --计算准确率
       v_veracity := v_predictNum / v_factNum;
      
       --将计算结果写入交叉报表 
       insert into t_calc_credit_check
       ( calcMonth,           fetchPercent,         predictNum,
         factNum,             veracity,             oweFlag
       )values
       ( pi_month,            v_percent,            v_predictNum,
         v_factNum,           v_veracity,           v_oweFlag                
       );       
      
       --循环次数加1
       v_i := v_i + 1;
     end loop;         

     vi_count := vi_count + sql%rowcount; 
     COMMIT;  

     v_n := v_n + 1;
  end loop;
 
  po_RetCode := '0'; 
  --写成功完成操作数据库日志   
 vi_Return := PG_SYS_MANAGER.F_SYS_SUCCESS_LOG(vi_count,0,0,0);

 --异常处理 
 EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;   --回滚操作
        po_RetCode := '1'; --出错标志为'1'
        po_ErrCode := SQLCODE; --出错代码
        po_ErrMsg  := SQLERRM||' || '||po_ErrMsg; --出错原因
        --写异常操作数据库日志
        vi_Return := PG_SYS_MANAGER.F_SYS_ERROR_LOG(0,0,0,0,'错误号:'||po_ErrCode||'  错误信息:'||po_ErrMsg);
 
end;


procedure P_MINER_CREDIT_VIEW
/********************************************************************************
* 过程名称: P_MINER_SALE_VIEW
* 功能描述: 创建客户信用度模型的应用数据视图
* 作    者: 袁虎声
* 编写日期: 2005.10
* 输    入: pi_month 统计月份
* 输    出: po_RetCode '0' 成功  '1'  失败
            po_ErrCode 输出oracle的sqlcode
            po_ErrMsg  输出oracle的sqlerrm
* 返 回 值:
* 修改历史:
* 修 改 人   日  期   修改说明
  --------  --------  -----------------------------------------------------------
********************************************************************************/
( pi_month   IN  VARCHAR2 ,
  po_RetCode OUT VARCHAR2 ,
  po_ErrCode OUT VARCHAR2 ,
  po_ErrMsg  OUT VARCHAR2
)

is
  vi_return    NUMBER(10);
  vc_DySql     VARCHAR2(2000);
  mon_part     char(2);
  next_month1  char(6);
  calcMonth    char(6);

begin
  vi_Return := PG_SYS_MANAGER.F_SYS_START_LOG(0,301006,0,'创建客户信用度模型的应用数据视图('||pi_month||'月)');
 
  calcMonth := pi_month;
  mon_part := substr(pi_month,5,2);
 
  vc_DySql := '
create or replace view t_miner_credit_view
as
select
SUBSCRBID,
SRVGPLNID,
DATUMVERIFY,
CUSTAGE,
SPECCODE,
USERLEVELCODE,
INNETDATE,
INSCALLINGRELCLIENTNUM,
INSCALLEDRELCLIENTNUM,
OUTSCALLINGRELCLIENTNUM,
OUTSCALLEDRELCLIENTNUM,
DEPOSITBALANCE,
CIOTHRES,
OVERDUEAMNT,
SHORTCALLTIMES,
TOTALCHARGE,
COTHRES,
TOTALCALLTIMES,
PAYMETHOD,
LACKSTOPNUM,
CALLINGCALLEDTIMESRATE,
TRANCALLTIMESRATE,
PLAINTTIMES,
AVEDAYCALLNUMRATE,
ACCOUNTCHANGERATE1,
ACCOUNTCHANGERATE2,
ACCOUNTCHANGERATE3,
CITYCALLFEERATE,
NATIONINSLONGFEERATE,
NATIONOUTSLONGFEERATE,
ADDVALUEFEERATE,
ROAMFEERATE,
ASSISTCARDNUM,
USERDEPOSITSUM,
AVETOTALCHARGE,
LOSEFAITHPROBILITY,
CLASS,
SPONSIONFLAG,
SRVGNUM,'||
''''||calcMonth||''' calcMonth'||'
from t_miner_credit_operation
where monpart = '''||mon_part||'''';
 
  EXECUTE IMMEDIATE vc_DySql;
 
  po_RetCode := '0';   
 vi_Return := PG_SYS_MANAGER.F_SYS_SUCCESS_LOG(0,0,0,0);

EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        po_RetCode := '1';
        po_ErrCode := SQLCODE;
        po_ErrMsg  := SQLERRM||' || '||po_ErrMsg;
        vi_Return := PG_SYS_MANAGER.F_SYS_ERROR_LOG(0,0,0,0,'错误号:'||po_ErrCode||'  错误信息:'||po_ErrMsg);
end P_MINER_CREDIT_VIEW;
end;

你可能感兴趣的:(exception,Date,user,table,Class,insert)