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;