我需要以不规则的时间间隔自动刷新物化视图,例如 0800 小时、1200 小时、1800 小时和 2200 小时。我只能定期安排刷新,如下所示
...
REFRESH FORCE ON DEMAND START WITH sysdate+0 NEXT sysdate+(6/24)
AS Select * from Employee;
我需要以不规则的时间间隔自动刷新物化视图,例如 0800 小时、1200 小时、1800 小时和 2200 小时。我只能定期安排刷新,如下所示
...
REFRESH FORCE ON DEMAND START WITH sysdate+0 NEXT sysdate+(6/24)
AS Select * from Employee;
你可以CASE
在你的NEXT
. 所以你可以做类似的事情
NEXT (CASE WHEN to_number( to_char( sysdate, 'HH24' )) >= 22
THEN trunc(sysdate+1) + interval '8' hour
...
ELSE null
END)
为了一般的理智,我通常会创建一个新函数(即get_next_refresh_time
)来实现此CASE
语句,并仅在您的物化视图中引用该函数。
CREATE OR REPLACE FUNCTION get_next_refresh_time
RETURN DATE
IS
l_dt DATE;
BEGIN
SELECT CASE WHEN to_number( to_char( sysdate, 'HH24' )) >= 22
THEN trunc(sysdate+1) + interval '8' hour
WHEN to_number( to_char( sysdate, 'HH24' )) < 8
THEN trunc(sysdate) + interval '8' hour
WHEN to_number( to_char( sysdate, 'HH24' )) between 8 and 11
THEN trunc(sysdate) + interval '12' hour
WHEN to_number( to_char( sysdate, 'HH24' )) between 12 and 17
THEN trunc(sysdate) + interval '18' hour
WHEN to_number( to_char( sysdate, 'HH24' )) between 18 and 21
THEN trunc(sysdate) + interval '22' hour
ELSE null
END
INTO l_dt
FROM dual;
RETURN l_dt;
END;
NEXT get_next_refresh_time;
我喜欢使用 DBMS_SCHEDULER 并设置一个作业来调用 DBMS_MVIEW.REFRESH(参见http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_mview.htm#ARPLS027)。这也为您的刷新提供了更多选项。