Oracle抽取數據的存儲過程

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;
微笑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章