oracle job 定时,启动,停止,察看状态。运行脚本

job里面的 last_date 和 next_date ,以及interval之间是什么关系,last_date到底是记的 job 的开始执行时间,还是执行结束的时间。next_date到底是 job 的开始时间还是结束时间加上 interval 得出的呢?

如果一个Job的执行时间比较长(比如超过了interval),会不会出现多个同样的 job 同时执行呢?

last_date=开始时间
last_date+interval=next_date

但要清楚,next_date 通常不是真正的开始时间,真正的开始时间往往比next_date 晚几秒,
也就是延时。

2、不会。

1
job的next time是在job开始执行的时候就算好了
不过是在job成功执行之后才写上去
当job的执行时间长过interval时候 也就是说在job的执行过程中nexttime就已经过了
那么nexttime就变为job执行完时的时间
2
你所说的情况不存在


SQL> exec dbms_job.broken(21,true);

PL/SQL 过程被成功完成

SQL> select * from user_jobs;

       JOB LOG_USER                       PRIV_USER                      SCHEMA_USER                    LAST_DATE   LAST_SEC         THIS_DATE   THIS_SEC         NEXT_DATE   NEXT_SEC         TOTAL_TIME BROKEN INTERVAL                                                                           FAILURES WHAT                                                                             NLS_ENV                                                                          MISC_ENV                                                           INSTANCE
---------- ------------------------------ ------------------------------ ------------------------------ ----------- ---------------- ----------- ---------------- ----------- ---------------- ---------- ------ -------------------------------------------------------------------------------- ---------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ---------------------------------------------------------------- ----------
        21 UNIONS                         UNIONS                         UNIONS                         2006-11-30  16:32:27                                      4000-1-1    00:00:00                  0 Y      trunc(sysdate)+16/24+1                                                                    0 ACHIEVETOHISTORY;                                                                NLS_LANGUAGE='SIMPLIFIED CHINESE' NLS_TERRITORY='CHINA' NLS_CURRENCY='RMB' NLS_I 0102000200000000                                                          0

SQL> exec dbms_job.run(21);

PL/SQL 过程被成功完成

SQL> select * from user_jobs;

       JOB LOG_USER                       PRIV_USER                      SCHEMA_USER                    LAST_DATE   LAST_SEC         THIS_DATE   THIS_SEC         NEXT_DATE   NEXT_SEC         TOTAL_TIME BROKEN INTERVAL                                                                           FAILURES WHAT                                                                             NLS_ENV                                                                          MISC_ENV                                                           INSTANCE
---------- ------------------------------ ------------------------------ ------------------------------ ----------- ---------------- ----------- ---------------- ----------- ---------------- ---------- ------ -------------------------------------------------------------------------------- ---------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ---------------------------------------------------------------- ----------
        21 UNIONS                         UNIONS                         UNIONS                         2006-11-30  16:46:14                                      2006-12-1 1 16:00:00                  0 N      trunc(sysdate)+16/24+1                                                                    0 ACHIEVETOHISTORY;                                                                NLS_LANGUAGE='SIMPLIFIED CHINESE' NLS_TERRITORY='CHINA' NLS_CURRENCY='RMB' NLS_I 0102000200000000                                                          0

试写一计划任务:

declare

v_job number :=1;

begin

dbms_job.submit(v_job,'sp_fact_charge_code;',sysdate,'sysdate+1/1440');

commit;

end;

/

解释一下上面的程序

程序主体有四个参数,分别意为:v_job是计划任务号,'sp_fact_charge_code'是计划任务名,如果是多个计划任务,就都用分号隔开,第三个sysdate意为立即执行此任务,第四个参数是间隔时间的设置,此处为每分钟执行一次,1/1440=1/24/60。

查看任务:select * from user_jobs;select * from all_jobs;

查看正在运行的任务(不推荐使用,速度慢):select * from dba_jobs_running;

另外值得一提的是,在安装oracle配置的时候,有这么一个参数:

job_queue_processes=4  (默认4)

这个参数是定义当前最多可同时运行几个job,它的最大值能设置为36。

除了submit参数外,其余的几个参数有:

        dbms_job.run(v_job);         //运行job

        dbms_job.broken(v_job,true,next_date);        //停止一个job,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。

        dbms_job.remove(v_job);        //删除某个job

        dbms_job.what(v_job,'sp_fact_charge_code;');        //修改某个job名

        dbms_job.next_date(v_job,sysdate);        修改下一次运行时间

例题,设定每天2:10:10运行

trunc(sysdate)+2/24+10/24/60+10/24/60/60        //运行时间

trunc(sysdate)+1+2/24+10/24/60+10/24/60/60        //间隔运行时间

例题,设定每月2号的2:10:10运行

trunc(sysdate,'mm')+1+2/24+10/24/60+10/24/60/60        //运行时间

trunc(add_mouths(sysdate,1),'mm')+1+2/24+10/24/60+10/24/60/60           //间隔运行时间

例题,设定每个季度……

trunce(sysdate,'Q')+1+2/24+10/24/60+10/24/60/60         //运行时间

trunce(add_mouths(sysdate,3),'Q'))+1+2/24+10/24/60+10/24/60/60         //间隔运行时间

另外年为'Y;

例题,设定每周一……

next_day(sysdate'星期一')

……

 

 

 

你可能感兴趣的:(工作经验&知识库)