今天项目里遇到需要定时刷新数据的问题,我在网上搜索了一下总结如下:
物化视图刷新的模式有两种: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;