1. 程式人生 > >Oracle物化檢視原理例項解析

Oracle物化檢視原理例項解析

最近專案上需要資料庫表優化,看了對大資料量的表進行線上重定義進行分割槽,偶然看到物化檢視的概念,感覺也十分有用,這篇文章寫的能看懂故轉載 出處 http://leonarding.blog.51cto.com/6045525/1354990
場合:資料變化小,查詢出資料還要2次利用,需要資料雙向同步的場合
檢視:就是一條sql語句,每次查詢時都要重新生成執行計劃,重新執行,非常消耗時間,放在記憶體中一次性的
物化檢視:執行sql並保留結果,直接放在資料檔案中,不放在記憶體中方便重用【空間換時間】,不受開關機的影響
1.建立基表並插入資料
create table sino_person_address
(
iid NUMBER(16) not null,
ipersonid NUMBER(16),
spin NUMBER(16),
dgettime DATE,
sorgcode VARCHAR2(20),
smsgfilename VARCHAR2(20),
ilineno NUMBER(8),
saddress VARCHAR2(60),
szip CHAR(6),
scondition CHAR(1),
itrust NUMBER(1),
stoporgcode VARCHAR2(14),
istate NUMBER(1),
constraint PK_SINO_PERSON_ADDRESS primary key (iid)
);
插入資料(插入自動增長序列號欄位的方法)
INSERT 語句插入這個欄位值為: 序列號的名稱.NEXTVAL,seq_sino_person_address.nextval
insert into sino_person_address values(seq_sino_person_address.nextval,123,to_date('2013-04-08 12:12:12','yyyy-mm-dd hh24:mi:ss'),'110','test_report',111,'beijing
xicheng','100100','1',123,1,'1000',0);
insert into sino_person_address values(seq_sino_person_address.nextval,123,to_date('2013-04-09 12:12:12','yyyy-mm-dd hh24:mi:ss'),'120','test_report2',121,'beijing
xicheng','100200','2',123,1,'1002',2);
insert into sino_person_address values(seq_sino_person_address.nextval,123,to_date('2013-04-10 12:12:12','yyyy-mm-dd hh24:mi:ss'),'130','test_report3',131,'beijing
xicheng','100300','3',123,1,'1003',3);
commit
###################################################################################################
2.建立物化檢視日誌
意義:記錄基表DML操作的變化,實時重新整理物化檢視
注:包含所有欄位
刪除物化檢視日誌
drop materialized view log on t
建立物化檢視日誌
create materialized view log on t with sequence,rowid (x,y,z) including new values;
引數說明:
with sequence:以序號增1的方式進行變化記錄
rowid (x,y,z):定位哪些資料發生了變化,日誌記錄rowid指向的資料塊的位置和變化
刪除物化檢視日誌
drop materialized view log on sino_person_address;
基於主鍵方式的重新整理,建立物化檢視日誌
CREATE MATERIALIZED VIEW LOG ON sino_person_address
WITH PRIMARY KEY
INCLUDING NEW VALUES
【TABLESPACE sinojfs2】; 可選項
3.建立物化檢視
建立物化檢視
create materialized view mv_t build immediate refresh fast on commit enable query rewrite as select x,y,z,count(*) from t group by x,y,z;
刪除物化檢視
drop materialized view mv_sino_person_address;
create materialized view mv_sino_person_address
tablespace SINOJFS2
build immediate 建立物化檢視時,立即重新整理基表
refresh fast with primary key 支援基於主鍵的快速重新整理(增量重新整理),基表必須有主鍵
on commit 支援commit動作自動重新整理
enable query rewrite
as select * from sino_person_address;
create materialized view mv_sino_person_address
tablespace SINOJFS2
build immediate
refresh fast with primary key refresh complete全部重新整理【全表重新整理】可選項
on demand 支援需求時手工重新整理
enable query rewrite
as select * from sino_person_address;
########################################################################################
引數說明:
build immediate:建立物化檢視時,立即重新整理基表
refresh fast with primary key:支援基於主鍵的快速重新整理(增量重新整理),基表必須有主鍵
on commit:基於commit動作的自動重新整理 on demand:基於需求時的手工重新整理
enable query rewrite:支援查詢重新(使用物化檢視代替基表,查詢必須重寫,查詢重寫是透明的並且不需要對物化檢視有任何許可權,物化檢視可以啟用和禁用查詢重寫)
查詢重寫:select * from t基表,執行計劃走的是mv_t物化檢視,禁用後,執行計劃走的就是t基表了
tablespace SINOJFS2 創建於SINOJFS2表空間
(1)建立方式:BUILD IMMEDIATE(立即生成資料), BUILD DEFERRED(下一次重新整理時生新資料), ON PREBUILD TABLE(不建立新的資料段,用已存在的含有當前物化檢視資料的表來代替);   
(2)ENABLE | DISABLE QUERY REWRITE指定是否啟用當前物化檢視用於查詢重寫,啟用該選項時,系統會檢查以保證查詢的可確定性(不允許有如序列數,USER, DATE等不確定的返回值),DISABLE時物化檢視照樣可以被重新整理;    
與物化檢視生效相關的設定    
(1)初始化引數JOB_QUEUE_PROCESSES設定大於零,物化的自動重新整理操作需要JOB QUEUE程序來執行;    
(2)初始化引數OPTIMIZER_MODE要設成某種CBO優化模式;    
(3)使用者會話有QUERY_REWRITE(優化器能將查詢重寫到本方案物化檢視)或GLOBAL_QUERY_REWRITE(優化器能將查詢重寫到其它方案的物化檢視)系統許可權;    
(4)初始化引數QUERY_REWRITE_ENABLED 指示優化器是否動態重寫查詢來使用物化檢視,這個引數可以在四個級別上進行設定(引數檔案,ALTER SYSTEM, ALTER SESSION, HINTS);    
(5)初始化引數QUERY_REWRITE_INTEGRITY 指示優化器在不同的資料一致性情況下決定是否使用物化檢視來重寫查詢,ENFORCED(只有在能確保資料一致的前提下才使用物化檢視), TRUSTED(資料不一定一致,只要有用維度物件定義的關係存在,就可使用物化檢視), STALE_TOLERATED(資料不一致,也沒有相關的維度定義時仍可使用物化檢視),這個引數可以在三個級別上進行設定(引數檔案,ALTER SYSTEM, ALTER SESSION);
4. 物化檢視DML操作測試
(1)驗證物化檢視是否隨記錄增加而增加
insert into sino_person_address values(seq_sino_person_address.nextval,123,to_date('2013-04-11 13:13:13','yyyy-mm-dd hh24:mi:ss'),'140','test_report4',141,'beijing
xicheng','100400','4',123,1,'1004',4);
select * from sino_person_address order by dgetdate;
select * from mv_sino_person_address order by dgetdate; 隨記錄增加而木有重新整理,必須commit之後才觸發物化檢視重新整理,沒有問題
exec dbms_mview.refresh('mv_sino_person_address','c'); 還可以手動全部重新整理【全表重新整理】(先清除,再重灌資料)
exec dbms_mview.refresh('mv_sino_person_address','f'); 也可以快速重新整理【增量重新整理】藉助物化檢視日誌,只檢查自上次重新整理後改變了的資料來進行重新整理)
(2)驗證物化檢視是否隨記錄刪除而減少
delete from sino_person_address where iid=21;
select * from sino_person_address order by dgetdate;
select * from mv_sino_person_address order by dgetdate; 隨記錄刪除而木有重新整理,必須commit之後才觸發物化檢視重新整理,沒有問題
exec dbms_mview.refresh('mv_sino_person_address','c'); 還可以手動全部重新整理【全表重新整理】(先清除,再重灌資料)
exec dbms_mview.refresh('mv_sino_person_address','f'); 也可以快速重新整理【增量重新整理】藉助物化檢視日誌,只檢查自上次重新整理後改變了的資料來進行重新整理)
(3)驗證物化檢視是否隨記錄修改而更新
update sino_person_address set sorgcode='200' where sorgcode='120';
select * from sino_person_address order by dgetdate;
select * from mv_sino_person_address order by dgetdate; 隨記錄修改而木有重新整理,必須commit之後才觸發物化檢視重新整理,沒有問題
exec dbms_mview.refresh('mv_sino_person_address','c'); 還可以手動全部重新整理【全表重新整理】(先清除,再重灌資料)
exec dbms_mview.refresh('mv_sino_person_address','f'); 也可以快速重新整理【增量重新整理】(藉助物化檢視日誌,只檢查自上次重新整理後改變了的資料來進行重新整理)
(4)驗證物化檢視是否隨truncate而清空
truncate table sino_person_address;
select * from sino_person_address order by dgetdate;
select * from mv_sino_person_address order by dgetdate; 隨記錄truncate而木有清空,必須手動truncate table mv_sino_person_address;才能清空(兩者是沒有關聯的),沒有問題
5.物化檢視重新整理
根據業務需求,每月定時重新整理。根據以上條件,選擇使用ORACLE自帶工具DBMS_MVIEW工具包中REFRESH方法對物化檢視進行重新整理。該方法有兩個引數,第一個引數是需要重新整理的物化檢視名稱,第二個引數是重新整理方式。我們可以寫儲存過程,對每個物化檢視呼叫一次REFRESH方法,也可以使用“,”把物化檢視連線以來,一次重新整理。
定義儲存過程
create or replace procedure pro_mview_refresh
as
begin
dbms_mview.refresh('mv_sino_person_address','f');
end;
/
執行儲存過程
execute pro_mview_refresh;
還可以重新整理所有物化檢視 dbms_mview.refresh_all_mviews;
建立儲存過程
drop procedure pro_refresh_all_mviews;
create or replace procedure pro_refresh_all_mviews
as
i number;
begin
dbms_mview.refresh_all_mviews(number_of_failures=>i);
dbms_output.put_line('number_of_failures=>'||i);
end;
/
執行
executepro_refresh_all_mviews;
set serveroutput on;不可放在儲存過程中,因為這是sqlplus命令,如果你怕忘記或者嫌麻煩可以把set serveroutput on;
寫入/opt/oracle/product/11.2.0/dbhome_1/sqlplus/admin/glogin.sql中,每次使用sqlplus時自動載入這個檔案
如果想用PL/SQL Developer工具訪問資料庫,請在C:\Program Files\PLSQL Developer\Login.sql 檔案裡新增
-- Autostart Command Window script
set serveroutput on;
這樣以後再使用PL/SQL Developer工具訪問資料庫就可以自動載入這條命令了
###############################################################################################
研發人員專用,手動重新整理,想刷就刷
set serveroutput on; 開啟螢幕顯示功能,就可以看到number_of_failures=>0結果
PL/SQL 匿名塊
declare
i number;
begin
dbms_mview.refresh_all_mviews(number_of_failures=>i);
dbms_output.put_line('number_of_failures=>'||i);
end;
/
number_of_failures=>0
Number_of_failures 表示重新整理物化檢視失敗個數
採用預設refresh force 重新整理方式:先試圖用FAST方式重新整理,如果失敗再用COMPLETE方式重新整理,這是預設的重新整理方式
注意:
1、 如果需要同時重新整理多個物化檢視,必須用逗號把各個物化檢視名稱連線起來,並對每個檢視都要指明重新整理方式(f、增量重新整理,c、完全重新整理,?、強制重新整理,從不重新整理)。
NEVER REFRESH(不重新整理)
REFREST FAST(藉助物化檢視日誌,只檢查自上次重新整理後改變了的資料來進行重新整理)
REFRESH COMPLETE(先清除,再重灌資料)
REFRESH FORCE(先試圖用FAST方式重新整理,如果失敗再用COMPLETE方式重新整理,這是預設的重新整理方式)
確定重新整理時機:
ON COMMIT(事務提交時重新整理),
ON DEMAND(用DBMS_MVIEW.REFRESH, DBMS_MVIEW.REFRESH_DEPENDENT, DBMS_MVIEW.REFRESH_ALL_MVIEWS來手工重新整理),
By Time(用START WITH 和 NEXT 子句建立的job來定時自動重新整理);
[dbms_mview.refresh('mv_sino_person_address,mv_person_address_his','ff');]
2、當日志和物化檢視建立好後,刪除日誌,則需要重新建立物化檢視,否則無法增量重新整理。
drop materialized view log on sino_person_address; 刪除日誌
SQL> exec dbms_mview.refresh('mv_sino_person_address','c'); 刪除物化檢視日誌,只可以支援物化檢視全部重新整理
PL/SQL procedure successfully completed
#################################################################################
SQL> exec dbms_mview.refresh('mv_sino_person_address','f'); 無法增量重新整理
begin dbms_mview.refresh('mv_sino_person_address','f'); end;
ORA-23413: 表 "SINOJFS"."SINO_PERSON_ADDRESS" 沒有實體化檢視日誌
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2558
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2771
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2740
ORA-06512: 在 line 2
SQL> create materialized view log on sino_person_employment 重新建立物化檢視日誌
2 with primary key
3 including new values;
Materialized view log created
SQL> exec dbms_mview.refresh('mv_sino_person_employment','f'); 但還是不支援增量重新整理,因為日誌內容和原表內容不一致了
begin dbms_mview.refresh('mv_sino_person_employment','f'); end;
ORA-12034: "SINOJFS"."SINO_PERSON_EMPLOYMENT" 上的實體化檢視日誌比上次重新整理後的內容新
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2558
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2771
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2740
ORA-06512: 在 line 2
因為:丟失了刪除日誌那一點->重建日誌那一點之間的原表DML變化,因此日誌內容和原表內容不一致了
解決方案:重建物化檢視日誌 重新【增量重新整理】和【全表重新整理】一遍
SQL> drop materialized view log on sino_loan_compact; 刪除日誌
Materialized view log dropped
SQL> create materialized view log on sino_loan_compact 重建日誌
2 with primary key
3 including new values;
Materialized view log created
SQL> exec dbms_mview.refresh('mv_sino_loan_compact','c'); 必須先全表重新整理
PL/SQL procedure successfully completed
SQL> exec dbms_mview.refresh('mv_sino_loan_compact','f'); 再增量重新整理,否則ORA-12034: "SINOJFS"."SINO_LOAN_COMPACT" 上的實體化檢視日誌比上次重新整理後的內容新
PL/SQL procedure successfully completed
小結:只要能夠增量重新整理,說明日誌沒有問題了
簡述所有檢視的快速重新整理和全表重新整理命令(測試使用) 10張檢視
select owner,table_name,tablespace_name,status from dba_tables where table_name in ('SINO_LOAN_APPLY');
update SINO_LOAN_APPLY set sorgcode ='1000' where iid =858;
exec dbms_mview.refresh('mv_sino_loan_compact','c');
exec dbms_mview.refresh('mv_sino_loan_compact','f');
exec dbms_mview.refresh('mv_sino_loan_apply','c');
exec dbms_mview.refresh('mv_sino_loan_apply','f');
exec dbms_mview.refresh('mv_sino_loan_spec_trade','c');
exec dbms_mview.refresh('mv_sino_loan_spec_trade','f');
exec dbms_mview.refresh('mv_sino_loan','c');
exec dbms_mview.refresh('mv_sino_loan','f');
exec dbms_mview.refresh('mv_sino_loan_guarantee','c');
exec dbms_mview.refresh('mv_sino_loan_guarantee','f');
exec dbms_mview.refresh('mv_sino_loan_investor','c');
exec dbms_mview.refresh('mv_sino_loan_investor','f');
###############################################################################
exec dbms_mview.refresh('mv_sino_person_employment','c');
exec dbms_mview.refresh('mv_sino_person_employment','f');
exec dbms_mview.refresh('mv_sino_person_address','c');
exec dbms_mview.refresh('mv_sino_person_address','f');
exec dbms_mview.refresh('mv_sino_person_certification','c');
exec dbms_mview.refresh('mv_sino_person_certification','f');
exec dbms_mview.refresh('mv_sino_person','c');
exec dbms_mview.refresh('mv_sino_person','f');
3.基表增加欄位後對應物化檢視不能自動同步結構
業務表增加 上報狀態 欄位 ipbcstate number(1) 可以為空
文件 建模 指令碼 物化檢視
sino_person_certification 完成 完成 完成 完成
sino_person 完成 完成 完成 完成
sino_person_address 完成 完成 完成 完成
sino_person_employment 完成 完成 完成 完成
sino_person_address_his 完成 完成 完成
sino_person_employment_his 完成 完成 完成
sino_person_his 完成 完成 完成
sino_loan 完成 完成 完成 完成
sino_loan_compact 完成 完成 完成 完成
sino_loan_spec_trade 完成 完成 完成 完成
sino_loan_guarantee 完成 完成 完成 完成
sino_loan_investor 完成 完成 完成 完成
sino_loan_apply 完成 完成 完成 完成
對比IPBCSTATE 欄位基表有,但物化檢視沒有,需要重建物化檢視解決
select * from mv_sino_loan_compact where rownum<2;
select * from sino_loan_compact where rownum<2;
select * from mv_sino_loan where rownum < 2;
select * from sino_loan where rownum < 2;
select * from mv_sino_loan_apply where rownum < 2;
select * from sino_loan_apply where rownum < 2;
select * from mv_sino_loan_guarantee where rownum < 2;
select * from sino_loan_guarantee where rownum < 2;
select * from mv_sino_loan_guarantee where rownum < 2;
select * from sino_loan_guarantee where rownum < 2;
select * from mv_sino_loan_investor where rownum < 2;
select * from sino_loan_investor where rownum < 2;
select * from mv_sino_loan_spec_trade where rownum < 2;
select * from sino_loan_spec_trade where rownum < 2;
################################################################################
select * from mv_sino_person where rownum < 2;
select * from sino_person where rownum < 2;
select * from mv_sino_person_address where rownum < 2;
select * from sino_person_address where rownum < 2;
select * from mv_sino_person_certification where rownum < 2;
select * from sino_person_certification where rownum < 2;
select * from mv_sino_person_employment where rownum < 2;
select * from sino_person_employment where rownum < 2;
##################################################################################
4.因為上面寫的物化檢視是基於主鍵進行重新整理的,因此原表必須要有主鍵
6.定時重新整理JOB
確定執行時間間隔   
1)、 每分鐘執行    
Interval => TRUNC(sysdate,'mi') + 1 / (24*60)    
2)、 每天定時執行    
例如:每天下午2點執行一次pro_mview_refresh儲存過程    
Interval => TRUNC(sysdate) + 1 +14/ (24)    
3)、 每週定時執行    
例如:每週一凌晨2點執行    
Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一週的第二天    
4)、 每月定時執行    
例如:每月1日凌晨2點執行    
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24    
5)、 每季度定時執行    
例如每季度的第一天凌晨2點執行    
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24    
6)、 每半年定時執行    
例如:每年7月1日和1月1日凌晨2點    
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24    
7)、 每年定時執行    
例如:每年1月1日凌晨2點執行    
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+2/24
通過jobs的使用就能實現每天或每月的指定時間執行一個函式、過程與命令
set serveroutput on 啟動螢幕輸出功能
SQL> execute dbms_output.put_line('This is'); 已經可以正常輸出
This is
建立作業
variable job_num number; 定義儲存job編號的變數
declare job_num number; pro_refresh_all_mviews
begin
dbms_job.submit
(job=>:job_num,
what=>'pro_refresh_all_mviews;',
next_date=>sysdate,
interval=>'sysdate+1/1440'); 每天1440分鐘,每一分鐘執行pro_mview_refresh過程一次
dbms_output.put_line('Job Number is'||to_char(job_num));
commit;
end;
/
############################################################################################
繫結變數版,必須先定義變數
variable job_num number;
declare job_num number;
begin
dbms_job.submit
(job=>:job_num,
what=>'pro_refresh_all_mviews;',
next_date=>sysdate,
interval=>'trunc(SYSDATE+5/1440,''MI'')'); 每5分鐘執行一次job
dbms_output.put_line('Job Number is'||to_char(job_num));
commit;
end;
/
例如:每天上午10點執行一次pro_refresh_all_mviews儲存過程   
Interval => TRUNC(sysdate) + 1 +10/ (24)    
declare job_num number;
begin
dbms_job.submit
(job=>:job_num,
what=>'pro_refresh_all_mviews;',
next_date=>sysdate,
interval=>'trunc(SYSDATE)+1+10/24'); 每天上午10點執行一次job
dbms_output.put_line('Job Number is'||to_char(job_num));
commit;
end;
/
Job Number is
PL/SQL procedure successfully completed
job_num
---------
1
####################################################################################
PL/SQL 匿名塊版,可以直接在塊中定義變數,比較方面現在採用這種
declare
job_num number;
begin
dbms_job.submit
(job=>job_num,
what=>'pro_refresh_all_mviews;',
next_date=>sysdate,
interval=>'trunc(SYSDATE)+1+10/24');
dbms_output.put_line('Job Number is '||job_num);
commit;
end;
/
Job Number is 4
PL/SQL procedure successfully completed
####################################################################################
dbms_job.submit( job out binary_integer,   
what in varchar2,    
next_date in date,    
interval in varchar2,    
no_parse in boolean)
●job:輸出變數,這是作業在作業佇列中的編號;   
●what:執行作業的儲存過程及其輸入引數;    
●next_date:作業初次執行的時間;    
●interval:作業執行的時間間隔。指上一次執行結束到下一次開始執行的時間間隔    
其中Interval這個值是決定Job何時,被重新執行的關鍵;當interval設定為null時,該job執行結束後,就被從佇列中刪除。假如我們需要該job週期性地執行,則要用‘sysdate+m’表示。如何更好地確定執行時間的間隔需要我們掌握一個函式TRUNC。
SQL> show parameter job_queue_process 作業佇列程序數,oracle能夠併發job數量,0~1000
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 1000
Oracle提供的資料字典user_jobs監控作業狀態
SQL> select job,log_user,what,last_date,last_sec,next_date,next_sec,failures,broken from user_jobs;
Job 作業唯一編號
Log_user 提交作業的使用者
What 作業執行的儲存過程
Last_date 最後一次成功執行作業的日期
Last_sec 最後一次成功執行作業的時間
Next_date 下一次執行作業日期
Next_sec 下一次執行作業時間
Failures 執行失敗次數,當執行job出現錯誤時,Oracle將其記錄在日誌裡,失敗次數每次自動加1,加到16之後Oracle就不在執行它了
Broken 是否是異常作業,當執行失敗次數達到16時,Oracle就將該job標誌為broken。此後,Oracle不再繼續執行它,直到使用者呼叫過程dbms_job.broken,重新設定為not broken,或強制呼叫dbms_job.run來重新執行它。Y標示作業中斷,以後不會執行,N表示作業正常,可以執行
執行作業   
begin    
         dbms_job.run(:job_num); job_num是儲存job編號的變數    
end;    
查詢作業狀態    
SQL> select job,log_user,what,last_date,last_sec,next_date,next_sec,failures,broken from user_jobs;
JOB LOG_USER WHAT LAST_DATE LAST_SEC NEXT_DATE NEXT_SEC FAILURES BROKEN
---------- --------- ---------------------------------------------------- ----------- ---------------- -----------
1 SINOJFS pro_refresh_all_mviews; 2013-4-26 1 11:27:38 2013-4-27 1 10:00:00 0 N
Job 作業唯一編號
Log_user 提交作業的使用者
What 作業執行的儲存過程
Last_date 最後一次成功執行作業的日期
Last_sec 最後一次成功執行作業的時間
Next_date 下一次執行作業日期
Next_sec 下一次執行作業時間
Failures 執行失敗次數,當執行job出現錯誤時,Oracle將其記錄在日誌裡,失敗次數每次自動加1,加到16之後Oracle就不在執行它了
Broken 是否是異常作業,當執行失敗次數達到16時,Oracle就將該job標誌為broken。此後,Oracle不再繼續執行它,直到使用者呼叫過程dbms_job.broken,重新設定為not broken;
或強制呼叫dbms_job.run來重新執行它。Y標示作業中斷,以後不會執行,N表示作業正常,可以執行
刪除作業   
begin    
         dbms_job.remove(:job_num);    
end;
修改作業
dbms_job.remove(jobno); 刪除job號
例 execute dbms_job.remove(1);
######################################################################
dbms_job.what(jobno,what); 修改執行的儲存過程
dbms_job.next_date(job,next_date)修改下次執行的時間
例 exec dbms_job.next_date(46,sysdate+2/(24*60)); 46作業號
#####################################################################
dbms_job.interval(job,interval)   :修改間隔時間
例 exec dbms_job.interval(46,sysdate+3/(24*60));
######################################################################   
dbms_job.broken(job,true)     中斷job
例 exec dbms_job.broken(46,true); 46作業號 exec dbms_job.broken(2,true) BROKEN=Y
#######################################################################
dbms_job.broken(job,false,next_date)   next_date:下次執行時間,如果不填則馬上啟動job
例 exec dbms_job.broken(46,false); 啟動job exec dbms_job.broken(2,false); BROKEN=N
########################################################################
dbms_job.run(jobno); 執行作業
例子 execute dbms_job.run(1);