复杂物化视图不能自动刷新的解决方式

今天项目里遇到需要定时刷新数据的问题,我在网上搜索了一下总结如下:

物化视图刷新的模式有两种:On Demand和On Commit。

        On Demand指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。

        On Commit指物化视图在对基表的DML操作提交的同时进行刷新。

刷新的方法有四种:Fast 、Complete 、Force和Never。

        Fast 刷新采用增量刷新,只刷新自上次刷新以后进行的修改。

        Complete 刷新对整个物化视图进行完全的刷新。

        如果选择Force方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用Complete 的方式。

        Never指物化视图不进行任何刷新。

        默认值是Force On Demand。

我们项目无法进行Commit刷新,就做了一个定时任务如下:

--创建视图

CREATE OR REPLACE VIEW VIEW_EXPORT_DATA AS  

SELECT * FROM TABLE1
INNER JOIN
      (table1
      union
      table2
      )


--创建物化视图
CREATE MATERIALIZED VIEW MVIEW_EXPORT_DATA
REFRESH FORCE ON DEMAND
START WITH TO_DATE('11-04-2018 18:58:05', 'DD-MM-YYYY HH24:MI:SS') NEXT SYSDATE+(1/(24*60))
AS
SELECT * FROM VIEW_EXPORT_DATA@ORCL;


--创建存储过程(刷新物化视图)
create or replace procedure refresh_mviews
AS
BEGIN
   dbms_mview.refresh('MVIEW_EXPORT_DATA');  
end refresh_mviews;

--创建job定时任务调用刷新物化视图的存储过程
declare
  job number;
BEGIN
  DBMS_JOB.SUBMIT(  
        JOB => job,  /*自动生成JOB_ID*/  
        WHAT => 'refresh_mviews;',  /*需要执行的存储过程名称或SQL语句*/  
        NEXT_DATE => sysdate,  /*初次执行时间*/  
        INTERVAL => 'sysdate+1/1440' /*每隔1分钟执行一次;*/
      );  
  commit;
end;

你可能感兴趣的:(oracle)