1. 程式人生 > >oracel資料庫、資料倉庫、JAVA開發的專欄

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查詢出這個任務來。