1.
- begin
- sys.dbms_job.submit(job => :job,
- what => 'job_stat_cooperate;',
- next_date => to_date('01-07-2008 05:00:00', 'dd-mm-yyyy hh24:mi:ss'),
- interval => 'TRUNC(SYSDATE+30)+5/24');
- commit ;
- end ;
- /
每个月1号早晨5点执行的JOB,上周尝试写的,这周过来,看到执行效果还OK.纪录下.
TRUNC(SYSDATE+30)+5/24 表示循环时间,现在时间加上30天后的日期,再加上具体的时间.
2.
对于 DBA来说,数据库 Job再熟悉不过了,因为经常要数据库定时的自动执行一些脚本,或做数据库备份,或做数据的提炼,或做数据库的性能优化,包括重建索引等等的工作。但是, Oracle定时器 Job时间的处理上,千变万化,今天我把比较常用写法汇总如下:
在总结之前,先把 Job的参数一一说明一下:
job 参数是由 Submit() 过程返回的 binary_ineger 。这个值用来唯一标识一个工作;
what 参数是将被执行的 PL/SQL 代码块;
next_date 参数指识何时将运行这个工作。写 Job 的时候可以不指定该值;
interval 参数何时这个工作将被重执行。
其中 Interval这个值是决定 Job何时,被重新执行的关键。
例如:有存储过程 p_dosomethings,需要被不同的时间间隔执行。
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
2
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
3
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
4
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
5
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
6
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
7
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
8
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
9
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
10
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
11
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
12
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
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
当然上面罗列不可能照顾到方方面面,但是稍微变化一下,就能衍生出无数的例子,聪明的你一定会的吧,我这里就不多罗嗦了。
3. 常要oracle数据库定时的自动执行一些脚本,或做数据库备份,或做数据的提炼,或做数据库 的性能优化,包括重建索引等等的工作,这时需要用到一个函数dbms_job.submit,来完成Oracle定时器Job时间的处理上。使用 dbms_job.submit这个函数,我们只需要考虑两个事情:安排某一任务,和定制一个执行任务的时间点。但最重要也是最棘手的事情,我认为还是确 定一个执行任务的时间点。时间点确定了,其他的事情就好办了。下面是函数dbms_job.submit使用方法:
- 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:任务执行的时间间隔。
其 中Interval这个值是决定Job何时,被重新执行的关键;当interval设置为null时,该job执行结束后,就被从队列中删除。假如我们需 要该job周期性地执行,则要用‘sysdate+m’表示。如何更好地确定执行时间的间隔需要我们掌握一个函数TRUNC。
1.TRUNC(for dates)
TRUNC函数为指定元素而截去的日期值。
其具体的语法格式如下:
TRUNC(date[,fmt])
其中:
date 一个日期值
fmt 日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去
下面是该函数的使用情况:
1)按年截尾
select TRUNC(TO_DATE('2008-03-01 08:23','yyyy-mm-dd hh:mi'),'yyyy') from dual
-----------------------------------------------------------
2008-1-1
2)按月截尾
select TRUNC(TO_DATE('2008-03-01 08:23','yyyy-mm-dd hh:mi'),'mm') from dual
--------------------------------------------------------
2008-3-1
3)按日截尾
select TRUNC(TO_DATE('2008-03-01 08:23','yyyy-mm-dd hh:mi'),'dd') from dual
----------------------------------------------------------------------
2008-3-1
4)按时截尾
select TRUNC(TO_DATE('2008-03-01 08:23','yyyy-mm-dd hh:mi'),'hh') from dual
----------------------------------------------------------------------
2008-3-1 8:00:00
5)按分截尾
select TRUNC(TO_DATE('2008-03-01 08:23','yyyy-mm-dd hh:mi'),'mi') from dual
----------------------------------------------------------------------
2008-3-1 8:23:00
2.确定执行时间间隔
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
3.实例
这里提供了一个简单的例子,主要是完成在每一个时间间隔内向一个表中插入一条记录
1)创建测试表
- SQL> create table test(id number,cur_time date);
- 表已创建。
- ----建sequence
- CREATE SEQUENCE test_sequence
- INCREMENT BY 1 -- 每次加几个
- START WITH 1 -- 从1开始计数
- NOMAXVALUE -- 不设置最大值
- NOCYCLE -- 一直累加,不循环
- CACHE 10 ;
--建触发器代码为:
- create or replace trigger tri_test_id
- before insert on test --test 是表名
- for each row
- declare
- nextid number;
- begin
- IF :new .id IS NULLor :new .id=0 THEN --id是列名
- select test_sequence.nextval --SEQ_ID正是刚才创建的
- into nextid
- from sys.dual;
- :new .id:=nextid;
- end if ;
- end tri_test_id;
2)创建一个自定义过程
- SQL> create or replace procedure proc_test as
- 2 begin
- 3 insert into test(cur_time) values(sysdate);
- 4 end;
- 5 /
过程已创建。
3)创建JOB
- SQL> declare job1 number;
- begin
- dbms_job.submit(job1,'proc_test;',sysdate,'sysdate+1/1440');--每天1440分钟,即一分钟运行test过程一次
- end;
PL/SQL JOB已成功完成。