Oracle的定时任务

/*查看当前用户的定时任务*/
SELECT JOB,NEXT_DATE,NEXT_SEC,FAILURES,BROKEN FROM USER_JOBS
/*建表*/
CREATE TABLE IRP_TEST(XTSJ VARCHAR2(14));
/*创建插入数据的存储过程*/
CREATE OR REPLACE PROCEDURE PRO_IRP_INSERT_TEST AS
BEGIN
  INSERT INTO IRP_TEST SELECT TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS') FROM DUAL;
END; 
/*创建在每天凌晨2点执行指定存储过程的定时任务*/ 
DECLARE
  X NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
    (
      JOB        => X
     ,WHAT       => 'IRP.PRO_IRP_INSERT_TEST;'
     ,NEXT_DATE  => TO_DATE('12-22-2009 17:22:04','mm/dd/yyyy hh24:mi:ss')
     ,INTERVAL   => 'TRUNC(SYSDATE+1)+2/24'
     ,NO_PARSE   => FALSE
    );
:JOBNUMBER := TO_CHAR(X);
END;

/*删除指定任务号21的定时任务*/
EXEC DBMS_JOB.REMOVE(21);

/*查看进程数*/
SHOW PARAMETER JOB_QUEUE_PROCESSES;
/*必须>0,否则执行下面的命令修改*/
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=5;



/*
下面说下常用的视图与参数:

任务队列中关于任务的数据字典视图

视图名               描述
DBA_JOBS             本数据库中定义到任务队列中的任务
DBA_JOBS_RUNNING     目前正在运行的任务
USER_JOBS            当前用户拥有的任务

JOB_QUEUE_PROCESSES  >= 1 (如果系统在同一时间会运行很多的job, 或者还有大量需要自动refresh的snapshot, 适当加大)

JOB_QUEUE_INTERVAL : 秒数(缺省为60秒), 根据你的job的调度频度而定, 对于一般的一天运行一次的job, 设为缺省值或者几分钟都可以. (不要设置过小, 以免影响性能)

JOB_QUEUE_KEEP_CONNECTION (系统默认就可以,我没发现他的作用)

DBA_JOBS 和 USER_JOBS.字典视图的字段含义

字段(列)                 类型               描述
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_LABEL     RAW MLSLABEL       该任务的信任Oracle会话符
CLEARANCE_HI               RAW MLSLABEL       该任务可信任的Oracle最大间隙
CLEARANCE_LO               RAW MLSLABEL       该任务可信任的Oracle最小间隙
NLS_ENV                   VARCHAR2(2000)     任务运行的NLS会话设置
MISC_ENV                   RAW(32)           任务运行的其他一些会话参数

视图DBA_JOBS_RUNNING的字段含义

列     数据类型     描述
SID           NUMBER           目前正在运行任务的会话ID
JOB           NUMBER           任务的唯一标示符
FAILURES       NUMBER           连续不成功执行的累计次数
LAST_DATE     DATE             最后一次成功执行的日期
LAST_SEC       VARCHAR2(8)     如HH24:MM:SS格式的last_date日期的小时,分钟和秒
THIS_DATE     DATE             目前正在运行任务的开始日期
THIS_SEC       VARCHAR2(8)     如HH24:MM:SS格式的this_date日期的小时,分钟和秒

任务重复运行间隔和间隔设计

 算法任务重复运行的时间间隔取决于interval参数中设置的日期表达式。下面就来详细谈谈该如何设置interval参数才能准确满足我们的任务需求。
  一般来讲,对于一个任务的定时执行,有三种定时要求。

    在一个特定的时间间隔后,重复运行该任务。

    在特定的日期和时间运行任务。

    任务成功完成后,下一次执行应该在一个特定的时间间隔之后。

    第一种调度任务需求的日期算法比较简单,即'SYSDATE+n',这里n是一个以天为单位的时间间隔。表6给出了一些这种时间间隔设置的例子。

    表6 一些简单的interval参数设置例子

描述                       Interval参数值
每天运行一次               'SYSDATE + 1'
每小时运行一次             'SYSDATE + 1/24'
每10分钟运行一次           'SYSDATE + 10/(60*24)'
每30秒运行一次             'SYSDATE + 30/(60*24*60)'
每隔一星期运行一次         'SYSDATE + 7'
不再运行该任务并删除它     NULL

     表6所示的任务间隔表达式不能保证任务的下一次运行时间在一个特定的日期或者时间,仅仅能够指定一个任务两次运行之间的时间间隔。
     例如,如果一个任务第一次运行是在凌晨12点,interval指定为'SYSDATE + 1',则该任务将被计划在第二天的凌晨12点执行。
     但是,如果某用户在下午4点手工(DBMS_JOB.RUN)执行了该任务,那么该任务将被重新定时到第二天的下午4点。
     还有一个可能的原因是如果数据库关闭或者说任务队列非常的忙以至于任务不能在计划的那个时间点准时执行。
     在这种情况下,任务将试图尽快运行,也就是说只要数据库一打开或者是任务队列不忙就开始执行,但是这时,运行时间已经从原来的提交时间漂移到了后来真正的运行时间。
     这种下一次运行时间的不断“漂移”是采用简单时间间隔表达式的典型特征。

    第二种调度任务需求相对于第一种就需要更复杂的时间间隔(interval)表达式,表7是一些要求在特定的时间运行任务的interval设置例子。

    表 7. 定时到特定日期或时间的任务例子

描述                           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)'

      第三种调度任务需求无论通过怎样设置interval日期表达式也不能满足要求。
      这时因为一个任务的下一次运行时间在任务开始时才计算,而在此时是不知道任务在何时结束的。
      遇到这种情况怎么办呢?当然办法肯定是有的,我们可以通过为任务队列写过程的办法来实现。
      这里我只是简单介绍以下,可以在前一个任务队列执行的过程中,取得任务完成的系统时间,然后加上指定的时间间隔,拿这个时间来控制下一个要执行的任务。
      这里有一个前提条件,就是目前运行的任务本身必须要严格遵守自己的时间计划。
*/     

你可能感兴趣的:(oracle)