2012-07-17 44 views
1

我需要以不规则的时间间隔自动刷新物化视图,例如0800小时,1200小时1800小时和2200小时。我只能,以尽可能获得尽可能定期调度刷新像下面以不规则的时间间隔自动刷新物化视图

给...

REFRESH FORCE ON DEMAND START WITH sysdate+0 NEXT sysdate+(6/24) 
AS Select * from Employee; 

回答

3

您可以在NEXTCASE声明。所以,你可以像

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; 
+0

谢谢先生。我感谢你的帮助和时间。 – 2012-07-17 17:47:57

+0

但实际上当我试图使用这个命令时,我得到一个错误,说 '错误报告: SQL错误:ORA-12899:值太大的列“SYS”。“SNAP $”。“”AUTO_FUN“(实际:748 ,最大值为200) 12899. 00000 - “列%s的值太大(实际:%s,最大值:%s)”' 当我试图只使用sysdate +8/24时,我没有得到这个错误。 .. – 2012-07-17 17:49:41

+1

@ user1532517 - 然后你需要使用我建议的函数方法。我不确定可接受的'CASE'声明的最大长度是多少。 – 2012-07-17 17:55:51