Oracle job定时器 用法

SQL herman 1281浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

在做某些业务时,需要用到 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_integer,这个值用来唯一标识一个工作;
  • what参数是将被执行的pl/sql代码块;
  • next_date参数指何时将运行这个工作;
  • interval参数指何时这个工作再次被执行,当interval设置为null时,该job执行结束以后,就被从队列中删除;
  • no_parse参数指此工作在提交或执行时是否应进行语法分析,默认值为false,表示笨pl/sql代码应该立即进行语法分析。

下面为创建 job 的一个具体实例:

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  
begin  
dbms_job.broken(25,true);  
commit;  
end;  
--停止一个job,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。  
dbms_job.broke(v_job,true,next_date); 

修改 job 的下一次运行时间

--修改某个job名 修改下一次运行时间  
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)
每隔一个星期运行一次 sysdate + 7
不再运行该任务并删除它 null
每天午夜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)

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

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » Oracle job定时器 用法