原文地址: https://www.jianshu.com/p/28f86d6a4bdc
DBMS_JOB是对任务队列进行调度和管理的包
- DBMS_JOB已经废除,由DBMS_SCHEDULER取代,推荐使用DBMS_SCHEDULER
- 你应该要撤销用户对DBMS_JOB的包执行权限来禁止DBMS_JOB的使用
1. 安全模型
使用DBMS_JOB不需要特别的系统权限,只有jobs的拥有者才能对jobs进行修改或删除. 只有procedures的拥有者或直接被授权对该procedures可执行的用户才能执行该procedures,而通过roles来间接获取执行执行权限的用户无法执行该procedures
DBMS_JOB支持jobs的多实例执行,默认是每个实例都能执行jobs,但是只有一个实例能够执行某个具体的job,你也可以通过将某个job绑定到特定的instance来强制执行instance binding.
2. DBMS_JOB的使用
2.1 查看任务
任务相关的表子在user_jobs中,因此可以通过sql查询语句区去查看相关信息,如下:
select job,what,next_date,next_sec,failure,broken from user_jobs;
显示结果类似如下:
JOB | NEXT_DATE | NEXT_SEC | FAILURES | B |
---|---|---|---|---|
1 | 11-JAN-18 | 19:05:35 | 0 | N |
说明当前任务队列中有一个任务,下一次执行的时间为11号的19:05:35.
2.2 提交job
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);
- 在语句后面加COMMIT会将job提交到job queue;
- what和interval的类型是字符串,需要用引号.
- what中的语句最后要加分号(
;
).
instance和force是用来控制instance和job的绑定关系,instance的默认值为0,表示任何的instance都能执行该job,force默认为false,表示设置的instance必须要处于running,否则会报错.
一般使用只管job,what,next_date和interval就够了.
示例:
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,
'dbms_ddl.analyze_object(''TABLE'',
''DQUON'', ''ACCOUNTS'',
''ESTIMATE'', NULL, 50);'
SYSDATE, 'SYSDATE + 1');
COMMIT;
END;
/
interval详解
interval必须是未来的时间,下面列举一些合法的时间:
Interval | Description |
---|---|
'sysdate + 7' | Run once a week. |
'next_day(sysdate,''TUESDAY'')' | Run once every Tuesday. |
'null' | Run only once. |
如果interval为null,则job在执行完成后会被自动从队列中删除.
2.3 删除job
DBMS_JOB.REMOVE (job IN BINARY_INTEGER );
从job队列中删除指定任务,已经在运行中的任务不会被停止
需要COMMIT
2.4 修改job
以下修改都需要COMMIT才能生效.
修改多个属性:
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);
修改inverval(运行周期):
DBMS_JOB.INTERVAL (
job IN BINARY_INTEGER,
interval IN VARCHAR2);
修改next_date(下次运行时间):
DBMS_JOB.NEXT_DATE (
job IN BINARY_INTEGER,
next_date IN DATE);
修改what(运行内容):
DBMS_JOB.WHAT (
job IN BINARY_INTEGER,
what IN VARCHAR2);
2.5 启动job
DBMS_JOB.RUN (
job IN BINARY_INTEGER,
force IN BOOLEAN DEFAULT FALSE);
该命令立刻执行任务并重新计算next_date.
也会将未加入job queue中的job加入其中.
2.6 停止job
DBMS_JOB.BROKEN (
job IN BINARY_INTEGER,
broken IN BOOLEAN,
next_date IN DATE DEFAULT SYSDATE);
- 如果对正在执行中的job执行BROKEN会失效,因为job执行结束后会重置job状态成正常. 所以选择未在运行中的job来执行BROKEN
- 需要COMMIT