【转】Oracle定时器(Job)各时间段写法汇总

原作者:博客园一条辉 原文:链接


对于DBA来说,数据库Job再熟悉不过了,因为经常要数据库定时的自动执行一些脚本,或做数据库备份,或做数据的提炼,或做数据库的性能优化,包括重建索引等等的工作。但是,Oracle定时器Job时间的处理上,千变万化,今天我把比较常用写法汇总如下: 

在总结之前,先把Job的参数一一说明一下: 

job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作; 

what参数是将被执行的PL/SQL代码块; 

next_date参数指识何时将运行这个工作。写Job的时候可以不指定该值; 

interval参数何时这个工作将被重执行。 

其中Interval这个值是决定Job何时,被重新执行的关键。 

例如:有存储过程 p_dosomethings,需要被不同的时间间隔执行。 

1declare   
2  jobno number;   
3begin   
4  dbms_job.submit( 
5    jobno, 
6    'p_dosomething;',  --what 
7    to_date('20090101020000','yyyy-mm-dd hh24:mi:ss'),--next_date,可以不填 
8    'Interval时间字符串'--interval,关键设置 
9  );   
10  commit;   
11end; 
12 



1、 每分钟执行 

Interval => TRUNC(sysdate,’mi’) + 1 / (24*60) 

2、 每天定时执行 

例如:每天的凌晨2点执行 

Interval => TRUNC(sysdate) + 1 +2 / (24) 

3、 每周定时执行 

例如:每周一凌晨2点执行 

Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一周的第二天 

4、 每月定时执行 

例如:每月1日凌晨2点执行 

Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24 

5、 每季度定时执行 

例如每季度的第一天凌晨2点执行 

Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24 

6、 每半年定时执行 

例如:每年7月1日和1月1日凌晨2点 

Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24 

7、 每年定时执行 

例如:每年1月1日凌晨2点执行 

Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+2/24 

当然上面罗列不可能照顾到方方面面,但是稍微变化一下,就能衍生出无数的例子,聪明的你一定会的吧,我这里就不多罗嗦了。 


转摘请注明:博客园一条辉的博客(liunx.cnblogs.com) 

补充: 
描述                    INTERVAL参数值 
每天午夜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)' 

select   *   from   user_jobs 
查询作业记录 


1.确保Oracle的工作模式允许启动任务队列管理器 
Oracle定时执行“Job Queue”的后台程序是SNP进程,而要启动SNP进程,首先要确保整个系统的模式是可以启动SNP进程的,这需要以DBA的身份去执行如下命令: 
svrmgrl>; alter system enable restricted session; 
或sql>; alter system disenable restricted session; 
利用如上命令更改系统的会话方式为disenable restricted,为SNP的启动创造条件。 



2.确保Oracle的系统已经配置了任务队列管理器的启动参数 
SNP的启动参数位于Oracle的初始化文件中,该文件放在$ORACLE_HOME/dbs路径下,如果Oracle的SID是myora8的话,则初始化文件就是initmyora8.ora,在文件中对SNP启动参数的描述部分如下: 
job_queue_process=n 
job_queue_interval=N 
第一行定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为0~36,根据任务的多少,可以配置不同的数值。 
第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为1~3600秒。事实上,该进程执行完当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。 
如果该文件中没有上面两行,请按照如上配置添加。配置完成后,需要重新启动数据库,使其生效。注意:如果任务要求执行的间隔很短的话,N的配置也要相应地小一点。 


3.将任务加入到数据库的任务队列中 
调用Oracle的dbms_job包中的存储过程,将任务加入到任务队列中: 
dbms_job.submit( job out binary_integer, 
what       in   archar2, 
next_date     in   date, 
interval     in   varchar2, 
no_parse     in   boolean) 
其中: 
●job:输出变量,是此任务在任务队列中的编号; 
●what:执行的任务的名称及其输入参数; 
●next_date:任务执行的时间; 
●interval:任务执行的时间间隔。 
下面详细讨论一下dbms_job.submit中的参数interval。严格地讲,interval是指上一次执行结束到下一次开始执行的时间间隔,当interval设置为null时,该job执行结束后,就被从队列中删除。假如我们需要该job周期性地执行,则要用‘sysdate+m’表示。  
将任务加入到任务队列之前,要确定执行任务的数据库用户,若用户是scott, 则需要确保该用户拥有执行包dbms_job的权限;若没有,需要以DBA的身份将权利授予scott用户: 
svrmgrl>; grant execute on dbms_job to scott; 



4.将要执行的任务写成存储过程或其他的数据库可执行的pl/sql程序段 
例如,我们已经建立了一个存储过程,其名称为my_job,在sql/plus中以scott用户身份登录,执行如下命令: 
sql>; variable n number; 
sql>; begin 
dbms_job.submit(:n‘my_job;’,sysdate, 
‘sysdate+1/360’); 
commit; 
end; 

系统提示执行成功。 
Sql>; print :n; 
系统打印此任务的编号,例如结果为300。 
如上,我们创建了一个每隔4分钟执行一次的任务号为300的任务。可以通过Oracle提供的数据字典user_jobs察看该任务的执行情况: 
sql>; select job,next_date,next_sec,failures,broken from user_jobs; 
执行结果如下: 
job next_date next_sec failures broken 
300 2000/10/10 11:45:15 0 N 
这表示任务号为300的任务,下一次将在2000/10/10 11:45:15执行,此任务的执行失败记录为0次。注意:当执行job出现错误时,Oracle将其记录在日志里,失败次数每次自动加1。当执行失败次数达到16时,Oracle就将该job标志为broken。此后,Oracle不再继续执行它,直到用户调用过程dbms_job.broken,重新设置为not broken,或强制调用dbms_job.run来重新执行它。 
除了以上我们讨论的submit存储过程之外,Oracle还提供了其他许多存储过程来操作任务。例如:dbms_job.change 、 dbms_job.what、dbms_job.interval可以用来修改提交的任务。要想删除该任务,只需运行dbms_job.remove(n)即可,其中n为任务号。 



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ylqmf/archive/2010/01/13/5185595.aspx 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值