CREATE OR REPLACE PROCEDURE P_7DAYS --地市因子計算過程,抽取數據
( P_DATE IN DATE)
/*
*/
AS
SQLCODE INTEGER;
V_SQLSTATE VARCHAR2(300); --用於保存出錯時的SQLSTATE碼
V_SQLCODE VARCHAR2(10); --
V_TN VARCHAR2(100); --用於記錄操作的表名
V_OP VARCHAR2(100); --記錄進行的操作
V_EXCP_REMARK VARCHAR2(1000); --
ERRORMSG VARCHAR2(300); --用於保存出錯信息
V_BUSINESS_DATE DATE; --抽取月份
V_FACTOR_CODE VARCHAR2(32); --統計因子代碼
V_FACTOR_NAME VARCHAR2(200); --統計因子名稱
V_MONTH_DAYS INTEGER;
V_SQL_FACTOR VARCHAR2(200); --
V_DEF_SQL VARCHAR2(2000); --
P_START_DATE DATE;
P_END_DATE DATE;
P_QTY NUMBER(22,7);
V_SQL_QTY VARCHAR2(4000);
V_UNIT VARCHAR2(10);
V_COMPANY_ID VARCHAR2(32); -- 公司代碼
TYPE CUR_TYPE IS REF CURSOR;
C_FACTOR CUR_TYPE; --
C_QTY CUR_TYPE; --
i INTEGER;
BEGIN
FOR i IN 0..6 LOOP
--此過程調度在凌晨執行
V_TN := '開始取初始化參數1'; --月份
SELECT TRUNC(P_DATE-i) INTO V_BUSINESS_DATE FROM DUAL;
V_TN := '開始取初始化參數2'; --公司
--SELECT ROW_ID INTO V_COMPANY_ID FROM MD_COMPANY where parent_company <0;
V_TN := '開始取初始化參數3'; --開始、結束日期
SELECT TRUNC(P_DATE-i) ,TRUNC(P_DATE-i) AS INTO P_START_DATE , P_END_DATE FROM DUAL;
V_TN := '循環因子表';
--循環因子表
V_SQL_FACTOR := 'SELECT FACTOR_CODE,FACTOR_NAME , UNIT,DEFINE_SQL FROM ODS_STATISTICS_FACTOR WHERE STATUS = 0 ORDER BY FACTOR_CODE';
--獲取公司代碼
-- SELECT t.COMPANY_CODE INTO V_COMPANY_ID FROM MD_COMPANY T WHERE t.PARENT_COMPANY = -1 AND ROWNUM = 1;
OPEN C_FACTOR FOR V_SQL_FACTOR; --
LOOP
FETCH C_FACTOR INTO V_FACTOR_CODE,V_FACTOR_NAME,V_UNIT,V_DEF_SQL ; ----
EXIT WHEN C_FACTOR%NOTFOUND;--
V_TN := '執行因子代碼:'||V_FACTOR_CODE||' 計算語句';
V_DEF_SQL :=REPLACE(V_DEF_SQL,'$P_START_DATE',P_START_DATE);
V_DEF_SQL :=REPLACE(V_DEF_SQL,'$P_END_DATE',P_END_DATE);
--V_DEF_SQL :=REPLACE(V_DEF_SQL,'$QTY','INTO P_QTY');
V_SQL_QTY := V_DEF_SQL ;
BEGIN
OPEN C_QTY FOR V_SQL_QTY;
LOOP
FETCH C_QTY INTO V_COMPANY_ID,P_QTY ;
EXIT WHEN C_QTY%NOTFOUND;--
V_TN := '表ODS_STATISTICS_DAY_VALUE,指標代碼:'||V_FACTOR_CODE;
DELETE FROM ODS_STATISTICS_DAY_VALUE_cs WHERE FACTOR_CODE=V_FACTOR_CODE AND TRUNC(BUSINESS_DATE)=TRUNC(V_BUSINESS_DATE) AND COMPANY_ID = V_COMPANY_ID;
execute immediate V_DEF_SQL;
INSERT INTO ODS_STATISTICS_DAY_VALUE_cs(ROW_ID,BUSINESS_DATE,FACTOR_CODE,FACTOR_NAME,QTY,UNIT,COMPANY_ID)
SELECT F_SM_GET_ROW_ID(0),V_BUSINESS_DATE ,V_FACTOR_CODE, V_FACTOR_NAME ,P_QTY,V_UNIT, V_COMPANY_ID FROM DUAL;
END LOOP;
CLOSE C_QTY;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
V_SQLSTATE := SUBSTR(SQLERRM, 1, 200);
V_SQLCODE := SQLCODE;
IF (V_TN IS NULL) THEN
ERRORMSG := '未操作表之前出錯! ' || ',出錯的SQLSTATE爲:' ||
V_SQLSTATE || ',SQLCODE:' || V_SQLCODE||'開始時間:'||P_START_DATE||'結束時間:'||P_END_DATE; --
ELSE
ERRORMSG := '操作' || V_TN || '時出錯,出錯的SQLSTATE爲:' || V_SQLSTATE || ',SQLCODE:' ||
V_SQLCODE||'開始時間:'||P_START_DATE||'結束時間:'||P_END_DATE; --
END IF; --
INSERT INTO MS_EXCEPTION_LOG ( ROW_ID, CREATED_BY, CREATED_TIME, LAST_UPD_BY, LAST_UPD_TIME, MODIFICATION_NUM,
COMPANY_CODE, COMPANY_NAME, PROC_NAME, EXCEPTION_BLOCK , SUCESS_FLAG , EXCEPTION_LOG, REMARK )
VALUES (F_SM_GET_ROW_ID(0),-1,SYSTIMESTAMP,-1,SYSTIMESTAMP, 0,'','','P_7DAYS',V_BUSINESS_DATE||V_TN,'1',ERRORMSG,V_EXCP_REMARK); --
COMMIT; --
END;
END LOOP;
CLOSE C_FACTOR;
--不發生異常,抽取成功
V_TN := 'P_ODS_STATISTICS_FACTOR_DS_DAY';
INSERT INTO MS_EXCEPTION_LOG ( ROW_ID, CREATED_BY, CREATED_TIME, LAST_UPD_BY, LAST_UPD_TIME, MODIFICATION_NUM,
COMPANY_CODE, COMPANY_NAME, PROC_NAME, EXCEPTION_BLOCK , SUCESS_FLAG , EXCEPTION_LOG, REMARK )
VALUES (F_SM_GET_ROW_ID(0),-1,SYSTIMESTAMP,-1,SYSTIMESTAMP, 0,'','','P_7DAYS',V_TN,'1',V_BUSINESS_DATE||'抽取成功',V_EXCP_REMARK); --
COMMIT;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
BEGIN
ROLLBACK;
V_SQLSTATE := SUBSTR(SQLERRM, 1, 200);
V_SQLCODE := SQLCODE;
IF (V_TN IS NULL) THEN
ERRORMSG := '未操作表之前出錯! ' || ',出錯的SQLSTATE爲:' ||
V_SQLSTATE || ',SQLCODE:' || V_SQLCODE; --
ELSE
ERRORMSG := '操作' || V_TN || '時出錯,操作類型爲:' || V_OP ||
';出錯的SQLSTATE爲:' || V_SQLSTATE || ',SQLCODE:' ||
V_SQLCODE; --
END IF; --
INSERT INTO MS_EXCEPTION_LOG ( ROW_ID, CREATED_BY, CREATED_TIME, LAST_UPD_BY, LAST_UPD_TIME, MODIFICATION_NUM,
COMPANY_CODE, COMPANY_NAME, PROC_NAME, EXCEPTION_BLOCK , SUCESS_FLAG , EXCEPTION_LOG, REMARK )
VALUES (F_SM_GET_ROW_ID(0),-1,SYSTIMESTAMP,-1,SYSTIMESTAMP, 0,'','','P_ODS_STATISTICS_FACTOR_DS_DAY',V_TN,'1',ERRORMSG,V_EXCP_REMARK); --
COMMIT; --
--P_STR_RETURN := '執行時出現異常,請在MS_EXCEPTION_LOG表中查看異常信息'; --
END;
-- P_STR_RETURN := 'OK'; --
RETURN;
END;