Oracle JOB两种作业建立及比较
来源:互联网 发布:指针 数组 区别 联系 编辑:程序博客网 时间:2024/05/12 09:42
存储过程准备
create table job_test (a date);
create or replace procedure test123 as
begin
insert into JOB_TEST values(sysdate);
commit;
end;
第一种,使用dbms_job存储过程建立作业
variable aaa number
begin
dbms_job.submit(:aaa,'test123;',sysdate,'sysdate+1/1440',true);
end;
/
begin
dbms_job.run(:aaa);
end;
/
begin
dbms_job.remove(:aaa);
end;
数据字典
select * from dba_jobs;
第二种 使用schedule_job建立作业
begin
dbms_scheduler.create_job(job_name => 'testjob',
job_type => 'stored_procedure',
job_action => 'person.test123',
start_date => to_date('201708251001','yyyymmddhh24mi'),
repeat_interval => 'freq=minutely;interval=1');
end;
/
begin
dbms_scheduler.enable('testjob');
end;
begin
dbms_scheduler.run_job('testjob');
end;
begin
dbms_scheduler.drop_job('testjob');
end;
/
数据字典:
select *from dba_scheduler_job_log where job_name='TESTJOB';
select *from dba_scheduler_jobs where job_name='TESTJOB';
注意:建立job的时候请注意数据库的参数job_queue_processes参数不能是0,如果是0的话数据库进程无法启动。修改参数后需重启
ps -ef | grep ora_j | grep -v grep 可通过此命令查看和job相关的调度进程是否启动,如果未启动则job一定不会执行。
job执行的由于执行需要依赖上一次执行,因此start_date最好设置为当前时间向后一点点,或者用固定时间来代替
比较:dbms_job和schedule_job的优劣,dbms_job没有job执行日志,schedule_job有日志,因此建议使用shcedule_job
dbms_job 时间间隔设置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)'
每月25号00:00执行: 'TRUNC(LAST_DAY(SYSDATE ) + 25)'
--------------------------
1:每分钟执行
Interval => TRUNC(sysdate,'mi') + 1/ (24*60)
或
Interval => sysdate+1/1440
2:每天定时执行
例如:每天的凌晨1点执行
Interval => TRUNC(sysdate) + 1 +1/ (24)
3:每周定时执行
例如:每周一凌晨1点执行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24
4:每月定时执行
例如:每月1日凌晨1点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24
5:每季度定时执行
例如每季度的第一天凌晨1点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
6:每半年定时执行
例如:每年7月1日和1月1日凌晨1点
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
7:每年定时执行
例如:每年1月1日凌晨1点执行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24
schedule_job时间间隔interval设置:
例如:设置任务仅在周5的时候运行:
REPEAT_INTERVAL => 'FREQ=DAILY; BYDAY=FRI';
REPEAT_INTERVAL => 'FREQ=WEEKLY; BYDAY=FRI';
REPEAT_INTERVAL => 'FREQ=YEARLY; BYDAY=FRI';
上述三条语句虽然指定的关键字小有差异,不过功能相同。
设置任务隔一周运行一次,并且仅在周5运行:
REPEAT_INTERVAL => 'FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI';
设置任务在当月最后一天运行:
REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=-1';
设置任务在3月10日运行:
REPEAT_INTERVAL => 'FREQ=YEARLY; BYMONTH=MAR; BYMONTHDAY=10'; REPEAT_INTERVAL => 'FREQ=YEARLY; BYDATE=0310';
上述两条语句功能相同。
设置任务每10隔天运行:
REPEAT_INTERVAL => 'FREQ=DAILY; INTERVAL=10';
设置任务在每天的下午4、5、6点时运行:
REPEAT_INTERVAL => 'FREQ=DAILY; BYHOUR=16,17,18';
设置任务在每月29日运行:
REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=29';
设置任务在每年的最后一个周5运行:
REPEAT_INTERVAL => 'FREQ=YEARLY; BYDAY=-1FRI';
设置任务每隔50个小时运行:
REPEAT_INTERVAL => 'FREQ=HOURLY; INTERVAL=50';
另外,你是否在怀念常规job中设置interval的简便,虽然功能较弱,但是设置操作非常简单,无须懊恼,其实SCHEDULER中的REPEAT_INTERVAL也完全可以按照那种方式设置,前面都说了,REPEAT_INTERVAL实际上是指定周期,直接指定一个时间值,当然也是周期喽。
或者也可以类似dbms_job写法:
REPEAT_INTERVAL => 'trunc(sysdate)+1'
又比如设置任务每周执行一次:
REPEAT_INTERVAL => 'trunc(sysdate)+7'
- Oracle JOB两种作业建立及比较
- oracle job的建立及执行
- 建立数据库JOB(作业)步骤
- Oracle job 作业
- [Oracle]job的建立
- ORACLE 创建作业JOB例子
- ORACLE 创建作业JOB例子
- ORACLE 创建作业JOB例子
- ORACLE 创建作业JOB例子
- ORACLE 创建作业JOB例子
- ORACLE 创建作业JOB例子
- ORACLE 创建作业JOB例子
- ORACLE 创建作业JOB例子
- ORACLE 创建作业JOB例子
- oracle job 建立调度任务
- oracle 10g job建立
- oracle:job 建立调度任务
- oracle job queue/oracle 作业队列
- office 2016激活码
- Android 当App内存不足或在后台运行时回收部分activity的流程分析。
- Python正则表达式的贪婪模式和非贪婪模式
- React-Native 问题集
- IIS新建网站报错:编译器错误信息: CS0016
- Oracle JOB两种作业建立及比较
- php学习之旅-2:HelloWorld
- 撤销本地git add操作
- java从服务器下载文件
- Jacobian矩阵,Hessian矩阵,牛顿法
- CodeForces-707c[数学构造]
- SpringMVC笔记(五)文件的上传下载
- Python开发环境搭建
- plsql使用技巧