在ORACLE数据库操作中,有时候我们需要定时的执行某些存储过程。那oracle如何实现呢?
从ORACLE 10.1版本开始,ORACLE开发了一个新的包DBMS_SCHEDULER。这个包就能帮解决我们的定时计划任务的问题。
一. 新增job
1. job创建实例
BEGIN DBMS_SCHEDULER.CREATE_JOB(JOB_NAME => 'JOB_EXWH_BPARTNER_STATIC',JOB_TYPE => 'PLsql_BLOCK',JOB_ACTION => 'DECLARE IO_ROW NUMBER; IO_STATUS NUMBER; VO_sqlERR VARCHAR2(1000); BEGIN --调用存储过程 BI_DM.P_F_T_EXWH_BPARNER_STATIC(sysdate,IO_ROW,IO_STATUS,VO_sqlERR); END;',REPEAT_INTERVAL => 'FREQ=DAILY;BYHOUR=15;BYMINUTE=00;BYSECOND=00;INTERVAL=1;',JOB_CLASS => 'DEFAULT_JOB_CLASS',ENABLED => TRUE,AUTO_DROP => FALSE,COMMENTS => '这是个测试'); END;
2.job语句
DBMS_SCHEDULER.CREATE_JOB
3.job参数
JOB_NAME: job名称
JOB_TYPE: job类型
- PLsql_BLOCK :表示任务执行的是一个PL/sql匿名块。
- STORED_PROCEDURE :表示任务执行是存储过程。
- EXECUTABLE :表示任务执行的是一个外部程序,比如说操作系统命令。
- CHAIN :表示任务执行的是一个CHAIN。
JOB_ACTION: job执行动作
REPEAT_INTERVAL:job的计划
JOB_CLASS:指定任务关联的CLASS,默认值为DEFAULT_JOB_CLASS
ENABLE: 创建时检查job有效性
COMMENTS: 备注
START_DATE: job生效时间
END_DATE: job结束时间
4.REPEAT_INTERVAL参数
FREQ:
YEARLY:以年单位
MONTHLY:以月单位
WEEKLY:以周单位
DAILY:以日单位
HOURLY:以小时单位
MINUTELY:以分单位
SECONDLY:以秒单位
INTERVAL: 执行次数
BYMONTHDAY:月份中的日期
BYDAY:星期
BYHOUR:小时
BYMINUTE:分钟
BYSECOND:秒
二. 查询job
--查询该用户所有job select * from USER_SCHEDULER_JOBS; --查询正在运行的job select * from USER_SCHEDULER_RUNNING_JOBS
三. 运行job
BEGIN DBMS_SCHEDULER.run_job(use_current_session =>FALSE,job_NAME => 'JOB_EXWH_BPARTNER_STATIC'); END;
四. 删除job
BEGIN DBMS_SCHEDULER.drop_job(job_name=>'JOB_EXWH_BPARTNER_STATIC',force=>FALSE); END;