数据库:oracle 11g,操作都在pl/sql客户端完成
第一步、创建一个”E_P_FFM_STATE(fltdt in varchar2)“存储过程
第二步、打开Command Window,创建job,
1 var job_num number; 2 begin 3 dbms_job.submit(:job_num,'E_P_FFM_STATE(null);',SYSDATE,'sysdate+5/24/60'); --5分钟执行一次 4 end;
执行成功,job id是25
第三步、运行job
1 begin 2 dbms_job.run(:job_num); 3 end;
在pl/sql左边,打开DBMS_Jobs,看到”25“的job
本来就这几步,简单得很,但我也查了许久,中间总有东西不对,按照上述步骤应该会成功
后记:
1. 网上说要设置job_queue_processes,决定能运行的job数目,但我运行
后来查到说是要用 SYSDBA 管理员账号登录。如果可以使用dba登录,使用
alter system set job_queue_processes=10 scope=both;
可以修改这个参数
2.dbms_job使用参数说明
- submit,创建
dbms_job.submit(:jobno,--job号 'your_procedure;',--要执行的过程/sql trunc(sysdate)+1/24,--下次执行时间 'trunc(sysdate)+1/24+1'--每次间隔时间 );
-
修改
dbms_job.what(jobno,what); --修改要执行的过程/sql语句 dbms_job.next_date(job,next_date);--修改下次执行时间 dbms_job.interval(job,interval);--修改间隔时间
- 启动
dbms_job.run(jobno);--启动job
- 停止
dbms.broken(jobno,--job号
broken,--true/false
nextdate --执行时刻
);--停止job
执行完以后记得commit事务
- 删除
dbms_job.remove(jobno);--删除job
也要commit事务,成功后pl/sql左边DBMS_Jobs就看不到”25“的job
3. 常用执行示例
INTERVAL参数值 | 描述 |
TRUNC(SYSDATE+1) | 每天午夜12点 |
TRUNC(SYSDATE+1)+(8*60+30)/(24*60) | 每天早上8点30分 |
TRUNC(next_day(sysdate,1))+2/24 | 每周一凌晨2点执行 |
TRUNC(LAST_DAY(SYSDATE))+1+1/24 | 每月1日凌晨1点执行 |
TRUNC(LAST_DAY(SYSDATE)+1) | 每个月第一天的午夜12点 |
TRUNC(ADD_MONTHS(SYSDATE,3),'q')+1/24 | 每季度的第一天凌晨1点执行 |
TRUNC(ADD_MONTHS(SYSDATE+2/24,3),'q')-1/24 | 每季度的最后一天的晚上11点执行 |
ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 | 每年7月1日和1月1日凌晨1点 |
ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24 | 每年1月1日凌晨1点执行 |
4. 相关数据表
select * from user_jobs
select * from all_jobs
select * from dba_jobs