首页 > 解决方案 > 您可以刷新触发器内的物化视图吗?甲骨文 11g

问题描述

基本上我有一个物化视图,当特定表 HISTORY_TABLE 更新时需要每月刷新一次,即 HISTORY_TABLE 仅插入到 c 中。每月一次。物化视图不包含与 HISTORY_TABLE 相关的数据,因此我无法在提交时刷新(据我所知)。

从我一直在阅读的内容来看,由于刷新时的隐式提交,因此无法刷新触发器内的 Mview。关于如何解决这个问题的任何想法?

DROP TRIGGER SYSADM.COMPLETE_NOTIF_SMS;

CREATE OR REPLACE TRIGGER SYSADM.COMPLETE_NOTIF_SMS
AFTER INSERT
ON SYSADM.HISTORY_TABLE
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE

   V_STATUS   NUMBER;
   V_NOTIFICATION_TEXT VARCHAR2(100);
   V_CHECK_CATEGORY VARCHAR2(100);
   
BEGIN
      
      insert into some_table values (v_check_category, v_notification_text,sysdate);  
      -- I want to refresh the Mview/snapshot here 
      DBMS_SNAPSHOT.REFRESH('mview_to_refresh');
                   
EXCEPTION
   WHEN OTHERS
   THEN
      
      -- Some variables are set to send an email.  
   
      RAISE;
END NOTIF_SMS;
/

标签: oracleplsqloracle11gtriggers

解决方案


我不确定我是否做对了,但我使用这样的全局参数刷新了我的视图:

  1. 我创建了一个这样的包来设置我想要使用的值:

create or replace package dwh.DWH_GLOBAL_PARAMS_MANAGER is

  -- Author  : ALI.FIDANLI
  -- Created : 21.03.2019 10:33:25
  -- Purpose : kelepelik


      PROCEDURE SET_ACC_DATE_CTX(PDATE DATE);


end DWH_GLOBAL_PARAMS_MANAGER;    

CREATE OR REPLACE PACKAGE BODY DWH.DWH_GLOBAL_PARAMS_MANAGER IS
      -- Author  : ALI.FIDANLI
      -- Created : 21.03.2019 10:33:25
      -- Purpose : kelepelik
            PROCEDURE SET_ACC_DATE_CTX(PDATE DATE)
          AS
        BEGIN
            dbms_session.set_context('DWH_PARAMS','REPORT_DATE',TO_CHAR(PDATE,'dd.mm.yyyy'));
            dbms_session.set_context('DWH_PARAMS','REPORT_DATE-1',TO_CHAR(PDATE-1,'dd.mm.yyyy'));
          END;
    END DWH_GLOBAL_PARAMS_MANAGER;

  1. 我在视图中使用了这些参数以及所需的参数:

  -- Author  : ALI.FIDANLI
  -- Created : 21.03.2019 10:33:25
  -- Purpose : kelepelik
CREATE OR REPLACE VIEW DWH.V_F_ACCOUNT AS
SELECT TO_DATE (SYS_CONTEXT ('DWH_PARAMS', 'REPORT_DATE-1'),'dd.mm.yyyy')  REPORT_DATE,
                 C.ACC_NO,
                 C.ACC_CURRENCY,
 pkg.func(C.ACC_NO, TO_DATE (SYS_CONTEXT ('DWH_PARAMS', 'REPORT_DATE-1'),'dd.mm.yyyy') ,C.ACC_GL_CODE) ACC_GL_CODE,        
            FROM xxxx.tablename C) ACC

所以我使用

begin
  -- Call the procedure
  dwh.dwh_global_params_manager.set_acc_date_ctx(pdate => :pdate);
end;

并使用我的观点....

让我知道它是否适合您,否则我将删除我的回复


推荐阅读