一、DBMS_JOB包的使用
DBMS_JOB包用於安排和管理作業隊列.通過使用作業,可以使ORACLE數據庫定期執行特定的任務.
注意:使用DBMS_JOB管理作業時,必須確保設置初始化參數JOB_QUEUE_PROCESSES(不能爲0)
1.SUBMIT
該過程用於建立一個新作業,當建立作業時,需要給出作業要執行的操作,作業的下次運行日期及時間間隔.
語法:
DBMS_JOB.SUBMIT(
job OUT BINARY_INTEGER,
what IN VARCHAR2,
next_date IN DATE DEFAULT sysdate,
interval IN VARCHAR2 DEFAULT 'null',
no_parse IN BOOLEAN DEFAULT FALSE,
instance IN BINARY_INTEGER DEFAULT any_instance,
force IN BOOLEAN DEFAULT FALSE);
如上所示,job用於指定作業編號;what用於指定作業要執行的操作;next_date用於指定作業的下次運行日期;
interval用於指定運行作業的時間間隔;no_parse用於指定是否解析與作業相關的過程;instance用於指定哪個
例程可以運行作業;force用於指定是否強制運行與作業相關的例程,下面以建立用於分析scott.emp表的作業爲
例,說明建立作業的方法.示例如下:
var jobno number
begin
dbms_job.submit(
:jobno,
'dbms_ddl.analyze_object(''table'',''scott'',''emp'',''compute'');',
sysdate,
'sysdate+1');
commit;
end;
/
jobno
---------
21
以上建立了一個作業,作業號爲:21,下面可以進行調用此作業號,運行;
2.REMOVE
該過程用於刪除作業隊列中的特定作業,語法如下:
DBMS_JOB.REMOVE (job IN BINARY_INTEGER);
下面以刪除作業21爲例,說明使用該過程的方法.如下:
DBMS_JOB.REMOVE(21);
3.CHANGE
該過程用於改變與作業相關的所有信息,包括作業操作,作業運行日期以及運行時間間隔等)語法如下:
DBMS_JOB.CHANGE(
job IN BINARY_INTEGER,what IN VARCHAR2,
next_date IN DATE,interval IN VARCHAR2,
instance IN BINARY_INTEGER DEFAULT null,
force IN BOOLEAN DEFAULT FALSE);
下面以改變作業的
exec DBMS_JOB.CHANGE(21,null,null,'SYSDATE+2')
4.WHAT
該過程用於改變作業要執行的操作,語法如下:
DBMS_JOB.WHAT(job IN BINARY_INTEGER,what IN VARCHAR2);
下面以改變作業21的運行操作爲例:
exec dbms_job.what(21,'dbms_stats.gather_table_stats(''scott'',''EMP'');');
5,NEXT_DATE
該過程用於改變作業的下次運行日期.語法如下:
DBMS_JOB.NEXT_DATE (job IN BINARY_INTEGER,next_date IN DATE);
下面以改變作業21的下次運行日期爲例.
DBMS_JOB.NEXT_DATE(21,'SYSDATE+1');
6.INSTANCE
該過程用於改變運行作業的例程,語法如下:
DBMS_JOB.INSTANCE (
job IN BINARY_INTEGER,
instance IN BINARY_INTEGER,
force IN BOOLEAN DEFAULT FALSE);
實例:
DBMS_JOB.INSTANCE(21,1)
7.INTERVAL
該過程用於改變作業的運行時間間隔.語法如下:
DBMS_JOB.INTERVAL(job in BINARY_INTEGER,interval IN VARCHAR2);
實例:
exec DBMS_JOB.INTERVAL(21,'SYSDATE+1/24/60');
8.BROKEN
該過程用於設置作業的中斷標記,當中斷了作業之後.作業將不會被運行.語法如下:
DBMS_JOB.BROKEN(
job IN BINARY_INTEGER,broken IN BOOLEAN,
next_date IN DATE DEFAULT SYSDATE);
實例:
exec DBMS_JOB.BROKEN(21,TRUE,'sysdate+1')
9.RUN
該過程用於運行已存在的作業.語法如下
DBMS_JOB.RUN(job iN BINARY_INTEGER,force IN BOOLEAN dEFAULT FALSE);
實例:
DBMS_JOB.RUN(21);
10.作業使用示例:
當在ORACLE 數據庫中使用作業時,應該首先使用過程SUBMIT來建立作業,然後使用過程RUN來運行作業.
下面以每天蒐集SCOTT方案的所有對應統計爲例.說明在ORACLE數據庫中使用作業的方法.
a. 創建一個表
SQL> create table T(a date);
b. 創建一個自定義過程
SQL>create or replace procedure p_t_insert is
begin
insert into t values(sysdate);
end;
/
c.創建JOB
SQL> variable job number;
SQL> exec DBMS_JOB.SUBMIT(:job,'p_t_insert;',sysdate,'sysdate+1/1440');--每天1440分鐘,即一分鐘運行p_t_insert過程一次
SQL> exec DBMS_JOB.RUN(:job);
SQL> select to_char(d,'yyyy/mm/dd hh24:mi:ss') 時間 from T;
時間
-------------------
2013/01/20 16:49:17
2013/01/20 16:50:19
2013/01/20 16:51:24
2013/01/20 16:52:29
2013/01/20 16:53:34
d.禁止作業運行
SQL>exec DBMS_JOB.BROKEN(:job,ture);
e.刪除作業
SQL>exec DBMS_JOB.REMOVE(:job);
f.job change//修改作業
SQL>execute dbms_job.change(:job,null,null,'sysdate+3');
SQL>execute dbms_job.change(:job,'scott.test(update)');
COMMIT;請記得一定要提交;
二、作業的管理
1.顯示當前使用所有作業:
select job, what, next_date, next_sec, sysdate, failures, broken,interval from user_jobs a;
相關視圖:dba_jobs、all_jobs、user_jobs、dba_jobs_running 包含正在運行job相關信息
2.初始化相關參數job_queue_processes
alter system set job_queue_processes=39 scope=spfile;//最大值不能超過1000 ;job_queue_interval = 10 //調度作業刷新頻率秒爲單位
DBA_JOBS describes all jobs in the database.
USER_JOBS describes all jobs owned by the current user
3.查詢job的情況。
show paramter background_dump_dest.
看alter.log 和trace
4.停其他用戶的job
SQL>exec sys.dbms_ijob.broken(21,true); --true停止,false打開
SQL>commit;
描述 INTERVAL參數值
每天1440分鐘,即一分鐘運行 sysdate+1/1440
每天午夜12點 'TRUNC(SYSDATE + 1)'
每天早上8點30分 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'
每星期二中午12點 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每個月第一天的午夜12點 'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每個季度最後一天的晚上11點 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6點10分 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'
DBA_JOBS 表內容
字段(列) 類型 描述
JOB NUMBER 任務的唯一標示號
LOG_USER VARCHAR2(30) 提交任務的用戶
PRIV_USER VARCHAR2(30) 賦予任務權限的用戶
SCHEMA_USER VARCHAR2(30) 對任務作語法分析的用戶模式
LAST_DATE DATE 最後一次成功運行任務的時間
LAST_SEC VARCHAR2(8) 如HH24:MM:SS格式的last_date日期的小時,分鐘和秒
THIS_DATE DATE 正在運行任務的開始時間,如果沒有運行任務則爲null
THIS_SEC VARCHAR2(8) 如HH24:MM:SS格式的this_date日期的小時,分鐘和秒
NEXT_DATE DATE 下一次定時運行任務的時間
NEXT_SEC VARCHAR2(8) 如HH24:MM:SS格式的next_date日期的小時,分鐘和秒
TOTAL_TIME NUMBER 該任務運行所需要的總時間,單位爲秒
BROKEN VARCHAR2(1) 標誌參數,Y標示任務中斷,以後不會運行
INTERVAL VARCHAR2(200) 用於計算下一運行時間的表達式
FAILURES NUMBER 任務運行連續沒有成功的次數
WHAT VARCHAR2(2000) 執行任務的PL/SQL塊
CURRENT_SESSION_LABEL RAW MLSLABEL 該任務的信任Oracle會話符
CLEARANCE_HI RAW MLSLABEL 該任務可信任的Oracle最大間隙
CLEARANCE_LO RAW MLSLABEL 該任務可信任的Oracle最小間隙
NLS_ENV VARCHAR2(2000) 任務運行的NLS會話設置
MISC_ENV RAW(32) 任務運行的其他一些會話參數