一个数据仓库数据刷新的实现机制(四)

PROCEDURE REFRESH_TAB

用于刷新由存储过程刷新的表数据,并纪录刷新信息

[@more@]

比较类似上一个过程refresh_mv,所不同的是在这里刷新数据所调用的存储过程作为传入参数

  PROCEDURE REFRESH_TAB(P_USER_NAME IN VARCHAR2,
                        P_TAB_NAME  IN VARCHAR2,
                        P_PROC_NAME IN VARCHAR2,
                        P_LOG_DIR   IN VARCHAR2) IS
    V_USER_NAM      EDEN_REFR_LOG.USER_NAM%TYPE := '';
    V_OBJ_NAM       EDEN_REFR_LOG.OBJ_NAM%TYPE := '';
    V_STRT_DAT_TIM  EDEN_REFR_LOG.STRT_DAT_TIM%TYPE := NULL;
    V_END_DAT_TIM   EDEN_REFR_LOG.END_DAT_TIM%TYPE := NULL;
    V_REFR_SEQ_NB   EDEN_REFR_LOG.REFR_SEQ_NB%TYPE := 0;
    V_TOT_DRTN_TIM  INTEGER := 0; -- time consumed in seconds
    V_ROWS_BEF_REFR EDEN_REFR_LOG.ROWS_BEF_REFR%TYPE := 0;
    V_ROWS_AFT_REFR EDEN_REFR_LOG.ROWS_AFT_REFR%TYPE := 0;
    V_ERR_TXT       EDEN_REFR_LOG.ERR_TXT%TYPE := '';
    V_BEGIN         EDEN_REFR_LOG.STRT_DAT_TIM%TYPE := NULL;
    V_END           EDEN_REFR_LOG.END_DAT_TIM%TYPE := NULL;
    V_PRG_DRTN      INTEGER := 0;
    V_COUNT         NUMBER;
 
    V_TAB_PROC      VARCHAR2(300);
    V_FULL_OBJ_NAME VARCHAR2(50) := '';
 
    MISS_TAB EXCEPTION;
 
  BEGIN
    --user and object...
    V_USER_NAM      := LOWER(P_USER_NAME);
    V_OBJ_NAM       := LOWER(P_TAB_NAME);
    V_FULL_OBJ_NAME := V_USER_NAM || '.' || V_OBJ_NAM;
 
    SELECT SYSDATE INTO V_BEGIN FROM DUAL;
 
    --max refresh num for current user and object...
    SELECT MAX(REFR_SEQ_NB) --max refresh num...
      INTO V_REFR_SEQ_NB
      FROM EDEN_REFR_LOG L
     WHERE L.USER_NAM = V_USER_NAM
       AND L.OBJ_NAM = V_OBJ_NAM;
    IF V_REFR_SEQ_NB IS NULL THEN
      V_REFR_SEQ_NB := 0;
    END IF;
 
    SELECT count(*)
      INTO V_COUNT
      FROM DBA_TABLES
     WHERE OWNER = upper(V_USER_NAM)
       AND TABLE_NAME = upper(V_OBJ_NAM);
    IF V_COUNT = 0 THEN
      RAISE MISS_TAB;
    END IF;
 
    --start time...
    SELECT SYSDATE INTO V_STRT_DAT_TIM FROM DUAL;
    -- row num before refresh...
    EXECUTE IMMEDIATE 'SELECT count(*) from ' || V_FULL_OBJ_NAME
      INTO V_ROWS_BEF_REFR;
    --THIS IS THE REAL JOB THAT WILL BE DONE...
    --CALL A PROCEDURE TO RECREATE TABLE
    V_TAB_PROC := 'begin ' || V_USER_NAM || '.' || P_PROC_NAME || '; end;';
    EXECUTE IMMEDIATE V_TAB_PROC;
    --end time...
    SELECT SYSDATE INTO V_END_DAT_TIM FROM DUAL;
    --what,total time of the job...
    EXECUTE IMMEDIATE 'SELECT count(*) from ' || V_FULL_OBJ_NAME
      INTO V_ROWS_AFT_REFR;
    V_TOT_DRTN_TIM := (V_END_DAT_TIM - V_STRT_DAT_TIM) * 24 * 60 * 60;
    --refresh successfully,and write log table...
    INSERT INTO EDEN_REFR_LOG
      (USER_NAM,
       OBJ_NAM,
       OBJ_TYPE,
       REFR_SEQ_NB,
       STRT_DAT_TIM,
       END_DAT_TIM,
       TOT_DRTN_TIM,
       ROWS_BEF_REFR,
       ROWS_AFT_REFR,
       ERR_TXT,
       STA_COD)
    VALUES
      (V_USER_NAM,
       V_OBJ_NAM,
       'P',
       V_REFR_SEQ_NB + 1,
       V_STRT_DAT_TIM,
       V_END_DAT_TIM,
       V_TOT_DRTN_TIM,
       V_ROWS_BEF_REFR,
       V_ROWS_AFT_REFR,
       '',
       'Y');
    COMMIT;
 
    SELECT SYSDATE INTO V_END FROM DUAL;
    V_PRG_DRTN := (V_END - V_BEGIN) * 3600 * 24;
 
    dbms_output.put_line('user name:           ' || v_user_nam);
    dbms_output.put_line('object name:         ' || v_obj_nam);
    dbms_output.put_line('object type:         ' || 'P');
    dbms_output.put_line('refresh seq No:      ' ||
                         to_char(v_refr_seq_nb + 1));
    dbms_output.put_line('refresh start:       ' ||
                         TO_CHAR(v_strt_dat_tim, 'DD-MON-YYYY HH24:MI:SS'));
    dbms_output.put_line('refrsh end:          ' ||
                         TO_CHAR(v_end_dat_tim, 'DD-MON-YYYY HH24:MI:SS'));
    dbms_output.put_line('refresh duration:    ' || V_TOT_DRTN_TIM ||
                         ' seconds');
    dbms_output.put_line('program start:       ' ||
                         TO_CHAR(V_BEGIN, 'DD-MON-YYYY HH24:MI:SS'));
    dbms_output.put_line('program end:         ' ||
                         TO_CHAR(V_END, 'DD-MON-YYYY HH24:MI:SS'));
    dbms_output.put_line('program duration:    ' || V_PRG_DRTN ||
                         ' seconds');
    dbms_output.put_line('rows before refresh: ' || v_rows_bef_refr);
    dbms_output.put_line('rows after refresh : ' || v_rows_aft_refr);
    dbms_output.put_line('error text:          ' || '');
    dbms_output.put_line('refresh status:      ' || 'Y');
 
  EXCEPTION
    WHEN MISS_TAB THEN
      V_ERR_TXT := 'ORA-00942: table does not exist';
      BEGIN
        INSERT INTO EDEN_REFR_LOG
          (USER_NAM,
           OBJ_NAM,
           OBJ_TYPE,
           REFR_SEQ_NB,
           STRT_DAT_TIM,
           END_DAT_TIM,
           ERR_TXT,
           STA_COD)
        VALUES
          (V_USER_NAM,
           V_OBJ_NAM,
           'P',
           V_REFR_SEQ_NB + 1,
           V_BEGIN,
           SYSDATE,
           V_ERR_TXT,
           'N');
        COMMIT;
        dbms_output.put_line('user name:           ' || v_user_nam);
        dbms_output.put_line('object name:         ' || v_obj_nam);
        dbms_output.put_line('object type:         ' || 'P');
        dbms_output.put_line('refresh seq No:      ' ||
                             to_char(v_refr_seq_nb + 1));
        dbms_output.put_line('refresh start:       ' ||
                             to_char(v_begin, 'dd-mon-yyyy hh24:mi:ss'));
        dbms_output.put_line('refresh end:         ' ||
                             to_char(sysdate, 'dd-mon-yyyy hh24:mi:ss'));
        dbms_output.put_line('error text:          ' || v_err_txt);
        dbms_output.put_line('refresh status:      ' || 'N');
     
      EXCEPTION
        WHEN OTHERS THEN
          V_ERR_TXT := SQLERRM;
          DBMS_OUTPUT.PUT_LINE(V_ERR_TXT); --write err msg to call env...
      END;
   
    WHEN OTHERS THEN
      V_ERR_TXT := SQLERRM;
      BEGIN
        INSERT INTO EDEN_REFR_LOG
          (USER_NAM,
           OBJ_NAM,
           OBJ_TYPE,
           REFR_SEQ_NB,
           STRT_DAT_TIM,
           END_DAT_TIM,
           TOT_DRTN_TIM,
           ROWS_BEF_REFR,
           ROWS_AFT_REFR,
           ERR_TXT,
           STA_COD)
        VALUES
          (V_USER_NAM,
           V_OBJ_NAM,
           'P',
           V_REFR_SEQ_NB + 1,
           V_STRT_DAT_TIM,
           V_END_DAT_TIM,
           V_TOT_DRTN_TIM,
           V_ROWS_BEF_REFR,
           V_ROWS_AFT_REFR,
           V_ERR_TXT,
           'N');
        COMMIT;
        SELECT SYSDATE INTO V_END FROM DUAL;
        V_PRG_DRTN := (V_END - V_BEGIN) * 3600 * 24;
        dbms_output.put_line('user name:           ' || v_user_nam);
        dbms_output.put_line('object name:         ' || v_obj_nam);
        dbms_output.put_line('object type:         ' || 'P');
        dbms_output.put_line('refresh seq No:      ' ||
                             to_char(v_refr_seq_nb + 1));
        dbms_output.put_line('refresh start:       ' ||
                             TO_CHAR(v_strt_dat_tim,
                                     'DD-MON-YYYY HH24:MI:SS'));
        dbms_output.put_line('refrsh end:          ' ||
                             TO_CHAR(v_end_dat_tim,
                                     'DD-MON-YYYY HH24:MI:SS'));
        dbms_output.put_line('refresh duration:    ' || V_TOT_DRTN_TIM ||
                             ' seconds');
        dbms_output.put_line('program start:       ' ||
                             TO_CHAR(V_BEGIN, 'DD-MON-YYYY HH24:MI:SS'));
        dbms_output.put_line('program end:         ' ||
                             TO_CHAR(V_END, 'DD-MON-YYYY HH24:MI:SS'));
        dbms_output.put_line('program duration:    ' || V_PRG_DRTN ||
                             ' seconds');
        dbms_output.put_line('rows before refresh: ' || v_rows_bef_refr);
        dbms_output.put_line('rows after refresh : ' || v_rows_aft_refr);
        dbms_output.put_line('error text:          ' || v_err_txt);
        dbms_output.put_line('refresh status:      ' || 'N');
     
      EXCEPTION
        WHEN OTHERS THEN
          V_ERR_TXT := SQLERRM;
          DBMS_OUTPUT.PUT_LINE(V_ERR_TXT); --write err msg to call env...
      END;
  END REFRESH_TAB;
END EDEN_REFRESH;

执行方式如下

SQL> exec eden_refresh.refresh_tab(schema_name,table_name,procedure_name,log_path);此处的log_path也没用到

SQL> exec eden_refresh.refresh_tab('edenfr','eden_flat_vhc_live_rate','EDEN_FLAT_VHC_LIVE_RATE_FR','c:');

PL/SQL procedure successfully completed


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/207/viewspace-795303/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/207/viewspace-795303/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要想在百度八亿网页的数据海洋中找到你所要的信息, 人工方式需要1200 多人年,而百度搜索技术不到1 秒钟。人 们被数据淹没,却渴望知识。商务智能技术已成为当今企业 获取竞争优势的源泉之一。商务智能通常被理解为将企业中 现有的数据转化为知识,帮助企业做出明智决策的IT工具集。 其中数据仓库、OLAP和数据挖掘技术是商务智能的重要组成 部分。商务智能的关键在于如何从众多来自不同企业运作系 统的数据中,提取有用数据,进行清理以保证数据的正确性, 然后经过抽取、转换、装载合并到一个企业级的数据仓库里, 从而得到企业数据一个全局视图,并在此基础上利用适当 的查询分析、数据挖掘、OLAP等技术工具对其进行分析处理, 最终将知识呈现给管理者,为管理者的决策过程提供支持。 可见,数据仓库技术是商业智能系统的基础,在智能系统开 发过程中,星型模式设计又是数据仓库设计的基本概念之一。 星型模式是由位于中央的事实表和环绕在周的维度表 组成的,事实表中的每一行与每个维度表的多行建立关系, 查询结果是通过将一个或者多个维度表与事实表结合之后产 生的,因此每一个维度表和事实表都有一个“一对多”的连 接关系,维度表的主键是事实表中的外键。随着企业交易量 的越来越多,星型模式中的事实表数据记录行数会不断增加, 而且交易数据一旦生成历史是不能改变的,即便不得不变动, 如对发现以前的错误数字做修改,这些修改后的数据也会作 为一行新纪录添加到事实表中。与事实表总是不断增加记录 的行数不同,维度表的变化不仅是增加记录的行数,而且据 需求不同维度表属性本身也会发生变化。本文着重讨论数据 仓库维度表的变化类型及其更新技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值