1

0800時間、1200時間、1800時間、2200時間など、不規則な間隔でマテリアライズドビューを自動的に更新する必要があります。以下に示すように、定期的に更新をスケジュールすることしかできません。

..。

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

2 に答える 2

3

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;
于 2012-07-17T17:37:52.803 に答える
2

私はDBMS_SCHEDULERを使用し、DBMS_MVIEW.REFRESHを呼び出すジョブを設定するのが好きです(http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_mview.htm#ARPLS027を参照)。これには、更新のためのオプションが増えるという追加の利点もあります。

于 2012-07-17T18:13:39.543 に答える