目录
(相关资料图)
Oracle定时任务是在oracle系统中一个非常重要的子系统,运用得当,可以大大提高我们系统运行和维护能力。oracle定时任务的功能,可以在指定的时间点自行执行任务。
那么在实际工作中,什么样的场景会用到定时任务呢?下面是在实际工作中用到的真实业务场景举例
在生成环境中,有时候需要在表中记录一些业务日志,系统运行时间长了之后,表中日志会越来越多,导致系统性能下降,这时候就需要用到定时任务,定时去删除表中一些时间年代比较久远垃圾数据。 在某些业务场景中,明细表的数据量特别大,而需要查询明细表一下汇总数据,就需要将明细表中的数据【某天的业务产生的金额、人数等】通过计算汇总到另外表中,这样在查询的时候就能优化查询效率。而以上操作需要在业务量比较少的情况下进行【一般都在凌晨之后】,这时就需要用到定时任务。variable jobno number;dbms_(:jobno, —-job号 "your_procedure;", —-执行的存储过程, ";"不能省略 next_date, —-下次执行时间 "interval" —-每次间隔时间,interval 以天为单位);
上面是通过脚本创建,当然也可以通过plsql图形化工具来创建,具体创建过程如下
**系统会自动分配一个任务号jobno ** ,根据jobno 可以进行如下定时任务操作
删除job: dbms_(jobno); 修改要执行的操作: job:dbms_(jobno, what); 修改下次执行时间:dbms__date(jobno, next_date); 修改间隔时间:dbms_(jobno, interval); 启动job: dbms_(jobno); 停止job: (jobno, broken, nextdate); –broken为boolean值show parameter job_queue_process;或者select * from v$parameter where name="job_queue_processes";
修改job_queue_processes参数 alter system set job_queue_processes = 10;
create table t_test (id varchar2(30), name varchar2(30) );
create or replace procedure proce_t isbegin insert into t_test (id, name) values ("1", to_char(sysdate, "yyyy-mm-dd hh24:mi:ss")); commit;end proce_t;/
variable jobno number;begin dbms_(:jobno,"proce_t;", sysdate, "sysdate+1/24/60"); commit;end;
select job, next_date, next_sec, failures, broken from user_jobs where job = "1424"
查询结果如下
SQL>select job, next_date, next_sec, failures, broken from user_jobs where job = "1424" 2 / JOB NEXT_DATE NEXT_SEC FAILURES BROKEN---------- ----------- ---------------- ---------- ------ 1424 2020-12-30 13:07:14 0 N
其中broken = N 表示该job已经生效
我们再来查看目标表中有没有定时插入数据
SQL>select * from t_test; ID NAME------------------------------ ------------------------------1 2020-12-30 13:05:141 2020-12-30 13:03:141 2020-12-30 13:04:141 2020-12-30 13:08:141 2020-12-30 13:06:141 2020-12-30 13:07:14 6 rows selected
可以看到,定时一分钟插入了一条数据。
1、根据jobno,执行以下脚本可以停止job
SQL>begin 2 dbms_(1424, true, sysdate); 3 commit; 4 end; 5 / PL/SQL procedure successfully completed
再来查看定时任务是否停用成功
SQL>select job, next_date, next_sec, failures, broken from user_jobs where job = "1424"; JOB NEXT_DATE NEXT_SEC FAILURES BROKEN---------- ----------- ---------------- ---------- ------ 1424 4000-01-01 00:00:00 0 Y
我们发现BROKEN=Y 说明定时任务已经停止成功了
SQL>begin 2 dbms_(1424); 3 commit; 4 end; 5 / PL/SQL procedure successfully completedSQL>select job, next_date, next_sec, failures, broken from user_jobs where job = "1424"; JOB NEXT_DATE NEXT_SEC FAILURES BROKEN---------- ----------- ---------------- ---------- ------ 1424 2020-12-30 13:20:53 0 N
BROKEN = N ,刚才的定时任务又启动了
下面总计了一些定时任务中常用的运行时间
每分钟执行: TRUNC(sysdate,"mi") + 1/(24*60) 半个小时: sysdate+30/(24*60) 每天凌晨1点执行: TRUNC(sysdate) + 1 +1/(24) 每周一凌晨1点执行: TRUNC(next_day(sysdate,"星期一"))+1/24 每月1日凌晨1点执行: TRUNC(LAST_DAY(SYSDATE))+1+1/24 每季度的第一天凌晨1点执行: TRUNC(ADD_MONTHS(SYSDATE,3),"Q") + 1/24 每年7月1日和1月1日凌晨1点: ADD_MONTHS(trunc(sysdate,"yyyy"),6)+1/24 每年1月1日凌晨1点执行: ADD_MONTHS(trunc(sysdate,"yyyy"), 12)+1/24 每个小时的第15分钟运行,比如:8:15,9:15,10:15…: trunc(sysdate,"hh")+(60+15)/(24*60)关键词:
中新网成都3月30日电 (王鹏 胡宇)四川九寨沟至绵阳高速公路(简称九绵高速)平武涪江特大桥主桥30日顺利合龙,标志着九绵高速建设取得
中新网徐州3月30日电(记者 朱志庚 ) 3月30日傍晚,徐州市政府举行本轮疫情以来的第2场疫情防控新闻发布会。截至3月29日下午3时,本
中新网宿迁3月30日电 (刘林 李小珍)29日,江苏泗洪一女子因家庭琐事跳河轻生,先后路过的3位市民跳入河中接力救人,因体力不济未能