Oracle 定时任务详解

1 概述

image.jpg

2 dbms_job

1. 查看数据库中定时任务的最多并发数(默认:1000)
   (1) show parameter job_queue_processes -- 超过了,就得排队

2. 设置数据库中定时任务的最多并发数(比如:10)
   (1) alter system set job_queue_processes = 10

3. 主要视图
   (1) select * from dba_jobs t; -- 所有 job 信息
   (2) select * from dba_jobs_running t; -- 执行中的 job 信息

4. 主要参数
   (1) job		: job 序列号(来自 sys.jobseq)
   (2) what		: 具体要做的事情,常为要调用的 '存储过程名'
   (3) next_date: 下次运行时间
   (4) interval : 时间间隔(周期),格式同平常咱写 日期一样,如:-- 不区分大小写
       <1> 每 30 秒运行一次	'SYSDATE + 30/(24*60*60)'
       <2> 每天午夜 12 点 'trunc(sysdate + 1)'

5. 日期函数
	select sysdate 当前时间,
	       sysdate + 1 每天,
	       sysdate + 1 / 24 每小时,
	       sysdate + 1 / (24 * 60) 每分钟,
	       sysdate + 1 / (24 * 60 * 60) 每秒,
	       sysdate + 7 每周,
	       trunc(sysdate + 1) 每天午夜12点,
	       trunc(sysdate + 1) + (8 * 60 + 30) / (24 * 60) 每天早上8点30分,
	       -- show parameter nls_date_language;  'TUESDAY'
	       next_day(trunc(sysdate), '星期二') + 12 / 24 每星期二中午12点,
	       trunc(last_day(sysdate)) + 1 每个月第一天的午夜12点,
	       trunc(add_months(sysdate + 2 / 24, 3), 'Q') - 1 / 24 每个季度最后一天的晚上11点,
	       -- 周六 saturday,周日 sunday
	       trunc(least(next_day(sysdate, '星期六'), next_day(sysdate, '星期日'))) +
	       (6 * 60 + 10) / (24 * 60) 每周六和周日早上6点10分
	  from dual;

dbms_job 包头部分:
image.jpg
基础数据准备:

create table dbms_job_history (
  message     varchar2(100),
  create_date date
);


create or replace procedure p_dbms_job_test as
begin
  -- 记录 job 信息
  insert into dbms_job_history
    (message, create_date)
  values
    ('dbms_job', sysdate);

  commit;
end;

2.1 提交

procedure 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, -- 是否需要解析与 job 相关的过程
                 instance  in binary_integer default 0, -- 指定哪个实例可以运行 job
                 force     in boolean default false); -- 是否强制运行与 job 相关的实例

说明:参数 no_parse、instance、force 一般不指定

示例:每三分钟调用一次过程 p_dbms_job_test:

declare
  job binary_integer;
begin
  dbms_job.submit(job       => job,
                  what      => 'p_dbms_job_test();',
                  next_date => sysdate, -- 立即执行
                  interval  => 'sysdate + 3/1440' -- 1天 = 24*60*60 = 1440
                  );
  -- 记得哦         
  commit;
end;

查询结果:
image.jpg

2.2 暂停

procedure broken(job       in binary_integer,
                 broken    in boolean,
                 next_date in date default sysdate);

示例:暂停上述定时任务

declare
begin
  dbms_job.broken(job => 28, broken => true);

  commit;
end;

查询截图:
image.jpg

2.3 修改

procedure 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);

其它都只是 chagne 的一部分,如
(1) what
(2) next_date
(3) interval
(4) instance

示例:修改上述定时任务的时间间隔为:每 5 分钟执行一次

declare
begin
  dbms_job.interval(job => 28, interval => 'sysdate + 5/1440');
  
  -- 记得提交
  commit;
end;

查询截图:
image.jpg

2.4 运行

procedure run(job   in binary_integer,
              force in boolean default false);

示例:运行上述已暂停的定时任务

declare
begin
  dbms_job.run(job => 28);

  commit;
end;

-- 等同于
-- declare
-- begin
--   dbms_job.broken(job => 28, broken => false, next_date => sysdate);
-- commit;
-- end;

查询截图:
image.jpg
image.jpg

2.5 删除

declare
begin
  dbms_job.remove(job => 28);

  commit;
end;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值