在oracle8i的版本中:
job_queue_interval integer 60 //喚醒間隔
job_queue_processes integer 0 //進程數。
其在linux平台可以通過ps –aux |grep ora_snp查看到其進程job_queue_processes最大可設為36個并行進程。
在oracle9i的版本中:
job_queue_processes integer
5
其在linux平台可以通過ps –aux
|grep ora_cjq查看到其進程job_queue_processes.
注意﹐以上參數只能在非限模式下才能有產﹐并且可以通過alter sysem來進行修改設置。
创建与修改job
我有一个存储过程名称为my_proc,需要每天中午12:30 定时执行
declare
i number;
begin
dbms_job.submit(i,'job_test;',trunc(sysdate)+1+12.5/24,'trunc(sysdate)+1+12.5/
commit;
end;
注意紅色部分﹕job_test的分號﹐一定要加上的。否則怎么弄也不行.
在oracle 里面时间是按天为单位的,比如1 表示1 天,170/24/60 表示170 分钟则是2 小时50分,trunc(sysdate)+1+170/24/60 表示当前job 执行完毕后,从当天零点开始计算增加1 天零170 分钟,把这个时间点作为下次job 执行的起点。
Job interval 的设置技巧
关于定时任务的设置技巧主要集中在intelval 上,我个人习惯习惯是,如果按天的任务,使用trunc(sysdate)+增量的方式,如果要在一天的某些特定时间点执行定期任务,比如我们的系统中有一个需求就是在8:30,9:30,10:30,15:00,16:00,17:00,23:00
这些点搜集statspack 信息供长期分析,那么我使用的interval 是
trunc(sysdate)+decode(to_char(sysdate,'hh24'),8,9.5,9,10.5,10,15,15,16,16,17,17,23,32.5)/24
这里decode 表示如果当前小时数是8 点则下一个时间点就是9.5/24 表示9 点半,如果是
9 则下一个时间点是10.5/24 表示10 点半……else 是32.5/24 表示第二天的8 点半,这样构
成了一个循环,当然我这里的前提是我确保这个任务能在半小时内完成。如果有特殊的要還應可以自定義函數來處理。其中next_date的時間以上一次執行完的時間點為准﹐如果報錯重復執行16次﹐如果還沒成功則dba_job的broken為Y.
日期表大式(例)
SYSDATE + 1 : 每隔一天,相同時間
SYSDATE + 1 + 22/24 : 隔天晚上10點
SYSDATE + 5/(24*60) : 每隔 5 分鐘
SYSDATE + 7 : 每隔一星期
SYSDATE + add_months(trunc(sysdate,'mm'),1) : 每月1日
Next_day(trunk(sysdate),”MONDAY”)+15/24
:每周一下行三點執行
ADD_MONTHS(TRUNC(SYSDATE,''MM''),1)+4+1/24') 每月五號執行
相關于job的數據字典
DBA_JOBS Lists all the jobs in the database. 列出数据库中的任务
USER_JOBS Lists all jobs owned by the user. 列出该用户拥有的任务
DBA_JOBS_RUNNING Lists all jobs in the database that are currently running. This view joins V$LOCK and JOB$. 列出当前运行的任务。
空缺一位網友關于非當前用戶調用job的文檔