oracle job调度,Oracle任务调度之DMBS_JOB

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

Reference

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值