在做某些业务时,需要用到 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”换成“星期五”。
: » Oracle job定时器 用法
原创文章,作者:Carrie001128,如若转载,请注明出处:https://blog.ytso.com/tech/database/252357.html