Oracle定时器(Job)汇总

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

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

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

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

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

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

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

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

declare   
   jobno number;   
 begin   
   dbms_job.submit(
     jobno,
     ‘p_dosomething;‘,  --what
     to_date(‘20090101020000‘,‘yyyy-mm-dd hh24:mi:ss‘),--next_date,可以不填
     ‘Interval时间字符串‘--interval,关键设置
   );   
  commit;

end;

建一个JOB,定时执行不带参数的函数:

DECLARE

job        BINARY_INTEGER; --任务ID

v_begin    DATE; --开始时间

v_interval VARCHAR2(50); --时间间隔

BEGIN

v_begin    := TRUNC(SYSDATE) + 12/24; --<当前日期的 12:00>

v_interval := ‘SYSDATE +1‘;     --<每隔24小时 执行一次>

DBMS_JOB.submit(job,                  --JOB编号

sg_wf_zxcf_syn;‘,     --what值

v_begin,               --下一个日期

v_interval,           --间隔

FALSE,

0,                     --合计时间

FALSE);

DBMS_OUTPUT.put_line(‘JOB(任务)编号:‘ || job);

COMMIT;

END;

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

8、 SQL语句

-------------查询JOB-----------------
select job, what, next_date, next_sec, sysdate, failures, broken,interval
  from user_jobs a;

-------------添加JOB-----------------
variable n number;

begin
  dbms_job.submit(:n, ‘MY_JOP;‘, sysdate,‘sysdate+2/(24*60*60)‘);
  commit;
end;

-------------修改JOB-----------------
begin
  dbms_job.change(62 ,‘MY_JOP;‘, sysdate,‘sysdate+2/(24*60)‘ );
  commit;
end;

begin
  dbms_job.change(62 ,‘MY_JOP;‘, to_date(‘2011-08-01 22:00:00‘, ‘yyyy-mm-dd hh24:mi:ss‘),‘sysdate+1‘);
  commit;
end;

-------------删除JOB-----------------
begin
 dbms_job.remove(41);
end;

-------------运行Job-----------------------
begin
 dbms_job.run(41);
end;

9、JOB案例:

建一个JOB,定时执行带参数的函数:

DECLARE

job        BINARY_INTEGER; --任务ID

v_begin    DATE; --开始时间

v_interval VARCHAR2(50); --时间间隔

BEGIN

v_begin    := TRUNC(SYSDATE) + 12/24; --<当前日期的 12:00>

v_interval := ‘SYSDATE +1‘;     --<每隔24小时 执行一次>

DBMS_JOB.submit(job,                   --JOB编号

‘declare V_SUMSG varchar(200);V_SUMWF varchar(200); V_SUMZXCF varchar(200); begin sg_wf_zxcf_syn(V_SUMSG,V_SUMWF,V_SUMZXCF);end;‘,    --what值

v_begin,             --下一个日期

v_interval,           --间隔

FALSE,

0,                     --合计时间

FALSE);

DBMS_OUTPUT.put_line(‘JOB(任务)编号:‘ || job);

COMMIT;

END;

时间: 2024-10-08 18:17:03

Oracle定时器(Job)汇总的相关文章

oracle exp 问题汇总

1. 用sys as sysdba方式连接数据库进行exp/imp windows 环境: exp 'sys/[email protected] as sysdba' file=exp.dmp log=exp.log  #注意这里是单引号 unix和linux环境 exp \'sys/[email protected] as sysdba\' file=exp.dmp log=exp.log #这里用\做转义字符,对‘进行转义 #如果不是按照上面方式执行exp导出,会报错 #LRM-00108

Oracle定时器调用存储过程

1. 创建表 create table job_table(run_time date); 2. 创建存储过程 create or replace procedure job_proc is begin insert into job_table (run_time) values (sysdate); end; 3. 创建定时器job,并且指定为一分钟执行一次 declare job number; begin dbms_job.submit(job, 'job_proc;', sysdate

Oracle定时器的应用

Oracle定时器,一旦设置,服务器的重启不会影响Oracle定时器的执行(定时每天执行), begin sys.dbms_job.submit(job => :job, what => 'check_err;', next_date => trunc(sysdate)+23/24, interval => 'trunc(next_day(sysdate,''星期五''))+23/24'); commit; end; 其中:job是系统自动产生编号,check_err是自己的一个过

oracle数据库报表汇总函数grouping

前两天同事问一个oracle使用grouping完成一个统计报表的功能,这个函数帅呆了.开发分组报表直接一个SQL就搞定. grouping(columnA)函数的意思:当前行如果是由rollup汇总产生的,那么columnA这个字段值为1否则为0 元数据: 通过grouping查询后的数据: sql: select decode(grouping(f_line)+grouping(f_workarea),1,'小计',2,'总计',f_workarea) f_workarea, decode(

oracle 常用命令汇总

登入oracle sqlplus / as sysdba SQL> startup ---启动oracle 数据库 SQL> shutdown immediate --停止数据库 conn smsdb/password --连接到smsdb用户 回到终端机模式,输入: $ lsnrctl status 检查看看监听器是否有启动 如果没有启动,可以输入: $ lsnrctl start emctl 另外也可以发现http://localhost.localdomain:1158/em 目前是没有

oracle常用函数汇总

一.运算符算术运算符:+ - * / 可以在select 语句中使用连接运算符:|| select deptno|| dname from dept; 比较运算符:> >= = != < <= like between is null in逻辑运算符:not and or 集合运算符: intersect ,union, union all, minus 要求:对应集合的列数和数据类型相同 查询中不能包含long 列 列的标签是第一个集合的标签 使用order by时,必须使用位置

Oracle常用知识汇总

NLS_LANG格式:NLS_LANG = language_territory.charset有三个组成部分(语言.地域和字符集),每个成分控制了NLS子集的特性.其中:language 指定服务器消息的语言.territory 指定服务器的日期和数字格式.charset 指定字符集例如:AMERICAN_AMERICA.US7SCIIAMERICAN _ AMERICA. ZHS16GBK只显示了语言信息,是因为数据库安装时默认使用OS的地域和字符集.安装Oracle的时候不是有个显示字符集

Oracle常见操作汇总(转)

前言:Oracle学习也有十几天了,但是呢,接下来还要学习许多其他的东西,并不能提步不前,所以在此总结了以下Oracle中常用的命令和语句,没有语法都是实例,以便以后工作的时候随时翻看,毕竟是自己的东西,一看就懂. 有关的语句和操作基本都是按照实战中的顺序来总结的,比如创建用户,建表,序列初始化,插入数据的顺序呢. 这篇文章的基表是大家最为熟知的Scott用户下的emp员工表,dept部门表以及salgrade薪水等级表,一切的语句都是围绕它写的. 下面来看一下Oracle中常用的操作都有哪些吧

Oracle 常见函数使用汇总

INSTR用法:INSTR(string,subString,position,ocurrence)解释:string:源字符串      subString:要查找的子字符串      position:查找的开始位置.若起始位置为0,返回值为0;当起始位置为负数的时候,从右边开始查找.      ocurrence:源字符串中第几次出现的子字符串 返回找到的位置(字符串下标是从0开始,如果查找到),如果找不到则返回0. 默认查找顺序为从左到右. SELECT INSTR('CORPORATE