网站首页 > 技术文章 正文
目录
- 一、Oracle定时任务简介
- 二、dbms_job涉及到的知识点
- 三、初始化相关参数job_queue_processes
- 四、实际创建一个定时任务(一分钟执行一次),实现定时一分钟往表中插入数据4.1 创建需要定时插入数据的目标表4.2 创建定时执行的存储过程4.3 创建定时一分钟定时任务job4.5 可以根据以下语句查询刚创建好的job4.6 如果我们不需要这个定时任务了,那要怎么停止呢?4.7 启用刚才停用的定时任务
- 五、定时任务中job运行时间
一、Oracle定时任务简介
Oracle定时任务是在oracle系统中一个非常重要的子系统,运用得当,可以大大提高我们系统运行和维护能力。oracle定时任务的功能,可以在指定的时间点自行执行任务。
那么在实际工作中,什么样的场景会用到定时任务呢?下面是在实际工作中用到的真实业务场景举例
- 在生成环境中,有时候需要在表中记录一些业务日志,系统运行时间长了之后,表中日志会越来越多,导致系统性能下降,这时候就需要用到定时任务,定时去删除表中一些时间年代比较久远垃圾数据。
- 在某些业务场景中,明细表的数据量特别大,而需要查询明细表一下汇总数据,就需要将明细表中的数据【某天的业务产生的金额、人数等】通过计算汇总到另外表中,这样在查询的时候就能优化查询效率。而以上操作需要在业务量比较少的情况下进行【一般都在凌晨之后】,这时就需要用到定时任务。
二、dbms_job涉及到的知识点
- 创建job脚本
variable jobno number;
dbms_job.submit(:jobno, —-job号
'your_procedure;', —-执行的存储过程, ';'不能省略
next_date, —-下次执行时间
'interval' —-每次间隔时间,
interval 以天为单位);
上面是通过脚本创建,当然也可以通过plsql图形化工具来创建,具体创建过程如下
**系统会自动分配一个任务号jobno ** ,根据jobno 可以进行如下定时任务操作
- 删除job: dbms_job.remove(jobno);
- 修改要执行的操作: job:dbms_job.what(jobno, what);
- 修改下次执行时间:dbms_job.next_date(jobno, next_date);
- 修改间隔时间:dbms_job.interval(jobno, interval);
- 启动job: dbms_job.run(jobno);
- 停止job: dbms.broken(jobno, broken, nextdate); –broken为boolean值
三、初始化相关参数job_queue_processes
- job_queue_process表示oracle能够并发的job的数量,当job_queue_process值为0时表示全部停止oracle的job
- 查看job_queue_processes参数
show parameter job_queue_process;
或者
select * from v$parameter where name='job_queue_processes';
- 修改job_queue_processes参数
alter system set job_queue_processes = 10;
四、实际创建一个定时任务(一分钟执行一次),实现定时一分钟往表中插入数据
4.1 创建需要定时插入数据的目标表
create table t_test (id varchar2(30),
name varchar2(30)
);
4.2 创建定时执行的存储过程
create or replace procedure proce_t is
begin
insert into t_test
(id, name)
values
('1', to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'));
commit;
end proce_t;
/
4.3 创建定时一分钟定时任务job
variable jobno number;
begin
dbms_job.submit(:jobno,
'proce_t;',
sysdate,
'sysdate+1/24/60');
commit;
end;
4.5 可以根据以下语句查询刚创建好的job
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:14
1 2020-12-30 13:03:14
1 2020-12-30 13:04:14
1 2020-12-30 13:08:14
1 2020-12-30 13:06:14
1 2020-12-30 13:07:14
6 rows selected
可以看到,定时一分钟插入了一条数据。
4.6 如果我们不需要这个定时任务了,那要怎么停止呢?
1、根据jobno,执行以下脚本可以停止job
SQL> begin
2 dbms_job.broken(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 说明定时任务已经停止成功了
4.7 启用刚才停用的定时任务
SQL> begin
2 dbms_job.run(1424);
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 2020-12-30 13:20:53 0 N
BROKEN = N ,刚才的定时任务又启动了
五、定时任务中job运行时间
下面总计了一些定时任务中常用的运行时间
- 每分钟执行: 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)
猜你喜欢
- 2024-10-22 Oracle 创始人:全球 AI 监控将导致人们更好的行为
- 2024-10-22 oracle中merge into语句详解 oracle merger into
- 2024-10-22 oracle 数据库高效批量更新操作 MERGE INTO
- 2024-10-22 西门子PCS7之电机控制编程 西门子电机调试软件
- 2024-10-22 (Oracle 11g)使用expdp每周进行数据备份并上传到备份服务器
- 2024-10-22 Oracle Access Manager中的漏洞可以让攻击者模拟任何用户帐户
- 2024-10-22 SQL优化思路(以oracle为例) sql优化 oracle
- 2024-10-22 未找到Oracle客户端和?络组件”问题解决方法
- 2024-10-22 云贝教育 | Oracle 19c OCP数据库培训课,上课啦
- 2024-10-22 Oracle实现金额小写转大写函数 oracle 小写字母转大写
你 发表评论:
欢迎- 05-30为什么说网上的md5加密解密站都是通过彩虹表解密的?
- 05-30一文读懂md5,md5有什么用,什么是md5加盐
- 05-30Java md5加密解密数据
- 05-30MD5是什么?如何进行MD5校验?
- 05-30专家教你简单又轻松的MD5解密方法,一看就会
- 05-30多学习才能多赚钱之:vscode怎么安装插件
- 05-30VSCode无限画布模式(可能会惊艳到你的一个小功能)
- 05-30VSCode神级Ai插件Cline:从安装到实战【创建微信小程序扫雷】
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)