oracel資料庫、資料倉庫、JAVA開發的專欄
有用過ORCLE 物化檢視的朋友,請幫個忙,我想每天重新整理兩次,比如中午十二點,晚上七點,不知道怎麼寫,急用!
你這個需要,可以這樣實現
建一個表,再寫個儲存過程
再用個SCHEDULE JOB來實現
用普通JOB,或者物化檢視,對於時間間隔都需要有規律
或者寫個儲存過程來手工重新整理物化檢視,然後用SCHEDULE JOB來實現每天12點,19點重新整理
對於oracle10g簡單方法:
1. 先建立一個物化檢視,不用指明重新整理引數,只要create materialized view,如
CREATE MATERIALIZED VIEW mv_emp
AS SELECT * FROM scott.emp;
2. 建立一個用來重新整理物化檢視的儲存過程,如
CREATE OR REPLACE PROCEDURE auto_refresh_mview_job_proc
AS
BEGIN
dbms_mview.REFRESH('mv_emp');
END;
/
3. 用ORACLE 10g的scheduler每天12:00和19:00定期重新整理物化檢視
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'auot_refresh_mview_job',
job_type => 'STORED_PROCEDURE',
job_action => 'scott.auto_refresh_mview_job_proc',
start_date => SYSDATE,
repeat_interval => 'FREQ=DAILY; BYHOUR=12,19',
enabled => TRUE,
comments => 'Refresh materialized view mv_emp'
);
END;
/
4. 刪除scheduler物件的方法
BEGIN
DBMS_SCHEDULER.DROP_JOB(
job_name => 'auot_refresh_mview_job'
);
END;
/
dbms_mview.REFRESH('mv_emp'); 這個是我想要的,謝謝了,還有,如果我之前用alter materialized view '|| a.table_name||' refresh complete start with sysdate next sysdate+100/(24*60*60)'||';' 建的重新整理,怎麼取消啊。
把重新整理物化檢視的JOB 刪除了就可以了,下面是查詢物化檢視及對應的jobno的語句:
SELECT job, what from user_jobs;
找到jobno後,用dbms_Job.remove就可以刪除job了
exec dbms_job.remove(:jobno);
3. 用ORACLE 10g的scheduler每天12:00和19:00定期重新整理物化檢視
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'auot_refresh_mview_job',
job_type => 'STORED_PROCEDURE',
job_action => 'scott.auto_refresh_mview_job_proc',
start_date => SYSDATE,
repeat_interval => 'FREQ=DAILY; BYHOUR=12,19',
enabled => TRUE,
comments => 'Refresh materialized view mv_emp'
);
上面這種方式我不怎麼明白。
物化檢視的定時重新整理其實是用Oracle的任務實現的,就是按照重新整理的時間間隔定期的執行DBMS_MVIEW.REFRESH('mv_emp')的.由於Oracle10g增加了功能更為強大的scheduler功能,可以更加靈活的定義執行任務的時間,因此這裡我給出的方法就是用10g的SCHEDULER,用scheduler要用到Oracle的內部包DBMS_SCHEDULER,其中DBMS_SCHEDULER.CREATE_JOB就是來建立一個實時執行的任務,下面是一個例子
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'auto_refresh_mview_job',
job_type => 'STORED_PROCEDURE',
job_action => 'scott.auto_refresh_mview_job_proc',
start_date => SYSDATE,
repeat_interval => 'FREQ=DAILY; BYHOUR=12,19',
enabled => TRUE,
comments => 'Refresh materialized view mv_emp'
);
job_name對應的引數是任務名,這個任務的名字就是'auto_refresh_mview_job'
job_type是任務的型別,這裡是儲存過程型別
job_action是任務的名稱,這裡就是儲存過程'scott.auto_refresh_mview_job_proc',儲存過程的功能就是執行dbms_mviw.refresh('mv_emp')
start_date是開始執行的時間,這裡是從任務建立時就開始執行
repeat_interval是執行的時間間隔,FREQ表示執行頻率,DAILY表示每天執行,BYHOUR定義了具體的執行時間為每天的12時和19時
enabled表示任務為啟用狀態,如果不加這個引數,為預設的不啟用
comments為任務的一個說明,這裡面的內容可以根據實際情況自行填寫。
定義了上面的任務後,可以從字典表dba_scheduler_jobs查詢出這個任務來。