Oracle job定时器 用法

在做某些业务时,需要用到 Oracle 的定时任务功能。这一般都是 DBA 来完成的,但是作为开发者我们还是有必要熟练的掌握的。下面将分享一些 Oracle job的用法心得。

顾名思义,定时器就是定时来完成某些操作,oracle 中的定时器 job 也是这种用法,在 oracle 中可以通过定义 job 来定期执行某个程序。oracle 提供内置包 DBMS_JOB 来执行job的相关操作,比如定义、提交、更改、停止、移除等。

创建 作业 job

创建 Oracle 作业 job 需要用到 submit() 过程,这个过程中有5个参数:job、what、next_date、interval、no_parse。

procedure submit(
	job out binary_integer,
	what in varchar2,
	next_date in date,
	interval in varchar2,
	no_parse in boolean:= FALSE
);

submit()过程的参数说明如下:

job参数是由submit()过程返回的binary_inhttp://www.anbomei.com/0aa2/0b2e6c4f6fc6.htmlteger,这个值用来唯一标识一个工作; what参数是将被执行的pl/sql代码块; next_date参数指何时将运行这个工作; interval参数指何时这个工作再次被执行,当interval设置为null时,该job执行http://www.anbomei.com/de90/7adeefce5ae5.html结束以后,就被从队列中删除; no_parse参数指此工作在提交或执行时是否应进行语法分析,默认值为false,表示笨pl/sql代码应该立即进行语法分析。

下面为创建 http://www.anbomei.com/89f8/11b4934955aa.htmljob 的一个具体实例:

DECLARE
  jobno NUMBER;
BEGIN
  dbms_job.submit(job       => jobno,
                  what      => 'OVER_PACK.ADD_DEPT(''EDUCATION'',2710);',
                  next_date => trunc(SYSDATE + 1),
                  INTERVAL  => 'TRUNC(SYSDATE + 1)');
  dbms_output.put_line('job_no = ' || jobno);
  COMMIT;
END;

查看 job

查看相关的job信息,可查询以下对象:dba_jobs、all_jobs、user_jobs、dba_jobs_running(正在运行的job信息)。

--查看job  
select * from sys.user_jobs 

运行 job

运行job通过dbms_job.run()来立即执行一个指定的工作,这个过程只接收一个参数。

BEGIN
    dbms_job.run(jobno); -- jobno就是上面定义过的jobno
END;

修改改 job

BEGIN
  DBMS_JOB.CHANGE(1, NULL, TRUNC(SYSDATE + 1) + 6 / 24, 'SYSDATE+4/24');
END;

删除 job

BEGIN
    dbms_job.remove(jobno);
END;

停止 job

---停止job  25是建立的job test_job_really  
http://www.anbomei.com/43cb/cc909c60e3e2.htmlbegin  
dbms_job.broken(25,true);  
commit;  
end;  
--停止http://www.anbomei.com/11f2/34e712e815a5.html一个job,里面参数true也可是false,http://www.anbomei.com/9708/ca2fea73d5f2.htmlnext_date(某一时刻停止)也可是sysdate(立刻停止)。  
dbms_job.broke(v_job,true,next_date); 

修改 job 的下一次运行时间

--修改某个job名 修改下一次运行http://www.anbomei.com/a64a/2d8a98f4882d.html时间  
dbms_job.next_date(v_job,sysdate);  
begin 
	dbms_job.next_date (v_job,SYSDATE + 10/(24*60)); 
end; 

DBMS_Job包含的子过程

Broken()过程。  change()过程。  Interval()过程。  Isubmit()过程。  Next_Date()过程。  Remove()过程。  Run()过程。  Submit()过程。  User_Export()过程。  What()过程。

关于 DBMS_Job包的子过程,请查看我的另外一篇文章:http://www.xttblog.com/?p=1339

定义了job之后,最重要的就是不要忘了用dbms_job.run()来运行job,以前我做的时候,就老是忘了执行。下面是一些常用的interval参数设置的例子:

描述 interval参数值 每天运行一次 sysdate + 1 每小时运行一次 sysdate + 1 / 24 每10分钟运行一次 sysdate + 10 / (60 * 24) 每30秒运行一次 sysdate + 30 / (60 * 24 * 60) 每隔一个星期运行一次 http://www.anbomei.com/50f5/74d0f0d1bb0f.html sysdate + 7 不再运行该任务并删除它 null 每天午夜12点 trunc(sysdate + 1) http://www.anbomei.com/1f52/ce546edbb582.html http://www.anbomei.com/684f/36520069e8e9.html每天早上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)

使用next_day的时候,可能会出现“周中的日期错误”,可以试试看将英文的日期换成中文的,比如“Friday”换成“星期五”。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!