Oracle 定时作业Job详解

Oracle 定时作业Job :用于安排和管理作业队列,通过使用作业,可以使Oracle数据库定期执行特定的任务。而且Oracle重新启动后,Job会继续运行,不用重新启动。

场景:

   (1)后台业务统计,如实现定时器任务业务场景每天统计订单数;

   (2)电信移动报表统计,如峰值、话单

   (3)批量数据同步,如Oracle 对 Oracle,SQLServer to Oracle等

   (4)电价系统

     (5)  计费系统 

    ……

   在很多应用场景中,应用程序的执行是有时间限制的,比如网站的后台统计、评价系统,通常会选择访问量和数据负荷较小的时间段来执行。限制应用的执行时间有很多种实现方式,包括操作系统级的,比如 Windows 下的定时任务和 Linux/Unix 中的 crontab;平台应用级的,比如 JDK 中的 Timer 和各种编程框架、数据库等系统中所提供的定时任务 API。关系数据库定时作业 尤以Oracle和SQLServer 为例。

 1.创建作业Job

declare
  job_id number;
begin
  sys.dbms_job.submit(job_id, 'JOB_Batch_P_Test;', sysdate, 'sysdate+1/1440'); --每隔一分钟运行一次
  sys.dbms_output.put_line(job_id); --输出job Id
end;

2. 查看Job运行情况

--相关视图
--需要dba权限
select * from dba_jobs; 
--需要dba权限
-- 正在运行job
select * from dba_jobs_running; 

select * from all_jobs;  

select * from user_jobs;

-- 其中最重要的字段就是job这个值就是我们操作job的id号,what 操作存储过程的名称,next_date 执行的时间,interval执行间隔

3. 启动作业Job

begin
   dbms_job.run(101);--运行指定Job 和select * from user_jobs;中的job值对应
end;

4.删除作业Job

begin
  dbms_job.broken(101,true);
  dbms_job.remove(101); --101为作业ID
end;
-- broken方法并不会立即中断job的运行,最好是找到job对应的线程kill掉。

Job 相关视图查询说明

-- 查询字段描述


字段(列)                  类型                 描述

JOB                        NUMBER          任务的唯一标示号

LOG_USER           VARCHAR2(30)    提交任务的用户

PRIV_USER          VARCHAR2(30)    赋予任务权限的用户

SCHEMA_USER        VARCHAR2(30)    对任务作语法分析的用户模式

LAST_DATE          DATE            最后一次成功运行任务的时间

LAST_SEC           VARCHAR2(8)     如HH24:MM:SS格式的last_date日期的小时,分钟和秒

THIS_DATE          DATE            正在运行任务的开始时间,如果没有运行任务则为null

THIS_SEC           VARCHAR2(8)     如HH24:MM:SS格式的this_date日期的小时,分钟和秒

NEXT_DATE          DATE            下一次定时运行任务的时间

NEXT_SEC           VARCHAR2(8)     如HH24:MM:SS格式的next_date日期的小时,分钟和秒

TOTAL_TIME         NUMBER          该任务运行所需要的总时间,单位为秒

BROKEN             VARCHAR2(1)     标志参数,Y标示任务中断,以后不会运行

INTERVAL           VARCHAR2(200)   用于计算下一运行时间的表达式

FAILURES           NUMBER     任务运行连续没有成功的次数

WHAT               VARCHAR2(2000)  执行任务的PL/SQL块

CURRENT_SESSION_LABELRAW          MLSLABEL 该任务的信任Oracle会话符

CLEARANCE_HI          RAW MLSLABEL     该任务可信任的Oracle最大间隙

CLEARANCE_LO          RAW              MLSLABEL 该任务可信任的Oracle最小间隙

NLS_ENV               VARCHAR2(2000)   任务运行的NLS会话设置

MISC_ENV              RAW(32)          任务运行的其他一些会话参数


创建Job语法说明

declare

    variable job number;

begin

    sys.dbms_job.submit(job => :job,

    what => 'prc_name;',                          --执行的存储过程的名字

    next_date => to_date('22-11-201309:09:41', 'dd-mm-yyyy hh24:mi:ss'),

    interval =>'sysdate+1/86400');            --每天86400秒钟,即一秒钟运行prc_name过程一次

    commit;

end;

使用dbms_job.submit方法过程,这个过程有五个参数:job、what、next_date、interval与no_parse。

 

dbms_job.submit(

job       OUT binary_ineger,

What      IN varchar2,

next_date IN  date,

interval  IN varchar2,

no_parse  IN booean:=FALSE)



job参数是输出参数,由submit()过程返回的binary_ineger,这个值用来唯一标识一个工作。一般定义一个变量接收,可以去user_jobs视图查询job值。

what参数是将被执行的PL/SQL代码块,存储过程名称等。

next_date参数指识何时将运行这个工作。

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

no_parse参数指示此工作在提交时或执行时是否应进行语法分析——true,默认值false。指示此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。

 

定时表达式

--每天运行一次
    'SYSDATE + 1'

--每小时运行一次
    'SYSDATE + 1/24'

--每10分钟运行一次                 
    'SYSDATE + 10/(60*24)'

--每30秒运行一次                    
    'SYSDATE + 30/(60*24*60)'

--每隔一星期运行一次               
    'SYSDATE + 7'

--每个月最后一天运行一次          
    'TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,1))) + 23/24'

--每年1月1号零时                    
    'TRUNC(LAST_DAY(TO_DATE(EXTRACT(YEAR FROM SYSDATE)||'12'||'01','YYYY-MM-DD'))+1)'

--每天午夜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)'

--每个月最后一天的23点           
    'TRUNC (LAST_DAY (SYSDATE)) + 23 / 24'

--每个季度最后一天的晚上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)'

结束语:Oracle 定时作业 Job 一般与存储过程结合使用,

 

你可能感兴趣的:(Oracle)