Oracle定时任务的创建与禁用/删除

news2024/11/14 23:22:17

在开始操作之前,先从三W开始,即我常说的what 是什么;why 为什么使用;how 如何使用。

一、Oracle定时器是什么

Oracle定时器是一种用于在特定时间执行任务或存储过程的工具,可以根据需求设置不同的时间段和频率来执行相应的操作。

二、为什么使用Oracle定时器

使用Oracle定时器的好处在于可以自动化执行重复性的任务,比如每天、每周或每月执行一次数据库维护、数据备份等操作,从而减轻了人工操作的负担,提高了工作效率。

三、如何使用Oracle定时器

使用Oracle定时器的方法包括编写存储过程来定义需要执行的任务,然后创建一个定时器Job来调度这个存储过程。可以根据具体需求设置定时器的执行时间、频率和其他参数,以实现自动化执行任务的目的。

四、目前有哪些主流Oracle定时器?有何区别?

目前主流的Oracle定时器有两种:DBMS_SCHEDULER和DBMS_JOB。它们之间有以下区别:
1. DBMS_SCHEDULER:DBMS_SCHEDULER是Oracle 10g及以上版本引入的定时器。它提供了更强大和灵活的功能,可以创建和管理复杂的作业调度。DBMS_SCHEDULER使用了面向对象的方式来定义作业和调度器,并且支持多种类型的作业,如PL/SQL块、存储过程、外部脚本等。它还支持更多的调度选项,如基于时间、日期、事件等触发器,以及更灵活的重复调度设置。

2. DBMS_JOB:DBMS_JOB是Oracle 9i及以下版本中使用的定时器。它相对简单,只能调度PL/SQL块作业。DBMS_JOB使用了过程式的方式来定义作业和调度器,调度选项相对较少,只能基于时间间隔来触发作业。此外,DBMS_JOB的调度信息存储在数据库中的JOB表中。

总的来说,DBMS_SCHEDULER比DBMS_JOB更强大和灵活,适用于复杂的作业调度需求。而DBMS_JOB则更简单,适用于简单的定时任务。

介绍了概念,接下来是实际使用,参考自蒋老师的文章,感谢蒋老师的分享和归纳——

oracle 定时任务 (yuque.com)icon-default.png?t=N7T8https://www.yuque.com/ernanbei/fh8sgs/fn20rxtaosmfdfnq?singleDoc#最常见的定时场景就是周期性统计动态变化的数据,以我为例,我需要在项目中加入一个Oracel定时器,每三分钟统计一次数据,那首先得写一个函数用于操作数据的读取和存储,其次是设置定时器,通过定时器定时周期性调度执行该函数,从而实现数据的周期性的获取。

1、函数的编写

create PROCEDURE SYNCHRONIZE_HONORING_HISTORY
AS
    V_ERR_MSG NVARCHAR2(1000);
    V_COUNT_1 NUMBER(1);
    V_COUNT_2 NUMBER(5) :=0;
    --查询当天的数据
    cursor c_job is select APPLY_RECORD_ID,
                           COMMENDATION_ID,
                           COMMENDATION_NAME,
                           USER_NAMES,
                           UPDATE_DATE,
                           COMMENDATION_SOURCE,
                           COMMENDATION_SOURCE_NAME,
                           COMPETENCE_DIMENSION,
                           COMPETENCE_DIMENSION_NAME,
                           SUM_SCORE,
                           BASE_DEPT_ID
                    from (select APPLY_RECORD_ID,
                                 COMMENDATION_ID,
                                 COMMENDATION_NAME,
                                 substr(USER_NAME, 0, instr(USER_NAME, ',', -1) - 1) USER_NAMES,
                                 UPDATE_DATE,
                                 COMMENDATION_SOURCE,
                                 COMMENDATION_SOURCE_NAME,
                                 COMPETENCE_DIMENSION,
                                 COMPETENCE_DIMENSION_NAME,
                                 SUM_SCORE,
                                 BASE_DEPT_ID
                          from (
                                   select A.APPLY_RECORD_ID,
                                          A.COMMENDATION_ID,
                                          C.COMMENDATION_NAME,
                                          xmlagg(xmlelement(e, d.name, ',').extract('//text()')).getclobval() USER_NAME,
                                          A.UPDATE_DATE,
                                          C.COMMENDATION_SOURCE,
                                          E.DICT_VALUE                                                        COMMENDATION_SOURCE_NAME,
                                          c.COMPETENCE_DIMENSION,
                                          F.DICT_VALUE                                                        COMPETENCE_DIMENSION_NAME,
                                          sum(B.SCORE)                                                        SUM_SCORE,
                                          A.BASE_DEPT_ID
                                   from (
                                            select APPLY_RECORD_ID,
                                                   COMMENDATION_ID,
                                                   UPDATE_DATE,
                                                   BASE_DEPT_ID
                                            from DIAN_COMMENDATION_APPLY_RECORD A
                                            where APPLY_STATUS = 'APPROVED'
                                              and UPDATE_DATE >= trunc(sysdate)
                                              and UPDATE_DATE <= trunc(sysdate+ 1)) A
                                            left join (select SOURCE_ID, USER_ID, SCORE,USER_ACCOUNT_ID
                                                       from DIAN_COMMENDATION_DISTRIBUTE_RECORD DR
                                                       where DR.CREATION_DATE >= trunc(sysdate)
                                                         and DR.CREATION_DATE <=  trunc(sysdate+ 1)) B
                                                      on a.APPLY_RECORD_ID = B.SOURCE_ID
                                            left join DIAN_COMMENDATION C
                                                      on A.COMMENDATION_ID = c.COMMENDATION_ID
                                            left join (select A.USER_ID,A.NAME,B.USER_ACCOUNT_ID
                                            from DIAN_USER_EXPAND A
                                                left join DIAN_USER_ACCOUNT b
                                                on a.USER_ID=b.USER_ID
                                                ) D
                                                      on B.USER_ID = D.USER_ID
                                                             and B.USER_ACCOUNT_ID = D.USER_ACCOUNT_ID
                                            left join (select DICT_VALUE, DICT_KEY
                                                       from DIAN_DICTIONARY_MAP
                                                       where DICT_TYPE = 'COMMENDATION_SOURCE'
                                                         and IS_ENABLE = 1) E
                                                      on E.DICT_KEY = c.COMMENDATION_SOURCE
                                            left join (select DICT_VALUE, DICT_KEY
                                                       from DIAN_DICTIONARY_MAP
                                                       where DICT_TYPE = 'COMPETENCE_DIMENSION'
                                                         and IS_ENABLE = 1) F
                                                      on F.DICT_KEY = c.COMPETENCE_DIMENSION
                                   group by A.APPLY_RECORD_ID,
                                            A.COMMENDATION_ID,
                                            C.COMMENDATION_NAME,
                                            A.UPDATE_DATE,
                                            C.COMMENDATION_SOURCE,
                                            E.DICT_VALUE,
                                            c.COMPETENCE_DIMENSION,
                                            F.DICT_VALUE,
                                            A.BASE_DEPT_ID
                              ));
    /**
     * create by: lcb
     * create date:2023-10-30
     * modify by:wxx
     * modify date:2023-12-8 加入基地ID BASE_DEPT_ID
     * describe:同步当天表彰历史数据 (每3分钟同步一次)
     */
BEGIN
    --循环
    FOR ITEM IN C_JOB
        LOOP
        --  判断数据是否存在
            SELECT COUNT(1) INTO V_COUNT_1 FROM DIAN_HONORING_HISTORY WHERE APPLY_RECORD_ID = ITEM.APPLY_RECORD_ID;
            IF V_COUNT_1 = 0 THEN
                -- 不存在则添加数据
                INSERT INTO DIAN_HONORING_HISTORY(APPLY_RECORD_ID,
                                                  COMMENDATION_ID,
                                                  COMMENDATION_NAME,
                                                  USER_NAMES,
                                                  UPDATE_DATE,
                                                  COMMENDATION_SOURCE,
                                                  COMMENDATION_SOURCE_NAME,
                                                  COMPETENCE_DIMENSION,
                                                  COMPETENCE_DIMENSION_NAME,
                                                  SUM_SCORE,
                                                  BASE_DEPT_ID)
                VALUES (ITEM.APPLY_RECORD_ID,
                        ITEM.COMMENDATION_ID,
                        ITEM.COMMENDATION_NAME,
                        ITEM.USER_NAMES,
                        ITEM.UPDATE_DATE,
                        ITEM.COMMENDATION_SOURCE,
                        ITEM.COMMENDATION_SOURCE_NAME,
                        ITEM.COMPETENCE_DIMENSION,
                        ITEM.COMPETENCE_DIMENSION_NAME,
                        ITEM.SUM_SCORE,
                        ITEM.BASE_DEPT_ID);
                
                IF V_COUNT_2 < 100 THEN
                    V_COUNT_2 := V_COUNT_2 + 1;
                ELSE
                    V_COUNT_2 := 0;
                    COMMIT;
                END IF;
            END IF;


        END LOOP;
    COMMIT;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        V_ERR_MSG := SQLERRM || CHR(13) || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
        JA_WRITE_LOG(JA_UTILS_PKG.GET_FN_NAME(), 'ERROR', V_ERR_MSG, -1, 1);
END;
/

2、设置Oralcle定时器

-- 表彰历史
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
      JOB_NAME => 'SYNCHRONIZE_HONORING_HISTORY2',
      JOB_TYPE => 'PLSQL_BLOCK',
      JOB_ACTION => 'SYNCHRONIZE_HONORING_HISTORY;',
      START_DATE => to_date('18-10-2022 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),--开始时间
      ENABLED => TRUE, --创建完成后激活
      REPEAT_INTERVAL => 'TRUNC(SYSDATE,''MI'')+3/(24*60)',  --每3分钟执行一次
--       REPEAT_INTERVAL => 'TRUNC(SYSDATE + 1) + (8*60 + 30)/(24*60)', --每天8:30执行
      COMMENTS => '每三分钟统计表彰历史'
    );
END;

注意:

如果是第一次使用定时器,需要手动将先前数据同步,如果数据量少可以从开始时间直接同步至当前时间对应数据,但是数据量较大则不建议这么做,会加剧数据库查询和存储的的负担,因此可能需要分时间对其切片,设置开始时间和结束时间并且跨度不宜过大,一点点同步到当前时间,后面就由定时器自动同步就好。

3.定时器的禁用与删除

也会遇到不再使用该定时器的情况,这时候提供了两种操作——禁用或删除。

操作步骤如下:

先查询数据库中的定时任务,查到相关信息如任务名,通过对查询到的任务名执行禁用/删除。

查看当前用户的定时任务指令

--查看当前用户的定时任务
select * from USER_SCHEDULER_JOBS;
-- 测试环境定时任务名
-- SYNCHRONIZE_HONORING_HISTORY_TASK   表彰历史同步
-- SYNCHRONIZE_JINGDIAN_STATISTICS_TASK  表彰项

禁用指令

--禁用
DBMS_SCHEDULER.DISABLE('TEST_JOB');  --暂时停止某个SCHEDULER JOB
--禁用定时任务
begin
DBMS_SCHEDULER.DISABLE('SYNCHRONIZE_HONORING_HISTORY_TASK');
DBMS_SCHEDULER.DISABLE('SYNCHRONIZE_JINGDIAN_STATISTICS_TASK');
end;

删除指令

--删除
DBMS_SCHEDULER.DROP_JOB(JOB_NAME => 'TEST_USER_INSERT',FORCE => TRUE);
-- 删除定时任务
begin
DBMS_SCHEDULER.DROP_JOB(JOB_NAME => 'SYNCHRONIZE_HONORING_HISTORY_TASK',FORCE => TRUE);
DBMS_SCHEDULER.DROP_JOB(JOB_NAME => 'SYNCHRONIZE_JINGDIAN_STATISTICS_TASK',FORCE => TRUE);
end;

这里我用的是禁用,状态可以在查询中查看,再次执行代码

--查看当前用户的定时任务
select * from USER_SCHEDULER_JOBS;

可以看到使用情况变成了False,状态变成了Disabled,应用成功啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1323852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于EasyDarwin、ffmpeg实现rtsp推流

目录 1 安装EasyDarwin 2 编译安装ffmpeg 3 启动EasyDarwin 4 ffmepg推流 5 百度网盘备份 某项目中测试时需要用到推流&#xff0c;于是用EasyDarwin、ffmpeg实现了RTSP推流&#xff0c;简单记录下过程&#xff0c; 1 安装EasyDarwin 这个可以去官网下载&#xff1a;Eas…

【openwrt学习笔记】IPV6 ND协议学习和socket编程

目录 一、参考链接二、学习目标三、代码解析3.1 仅解析NA报文保存设备mac和ipv6地址信息3.1.1 open_ns_socket3.1.2 recv_ns_pack 3.2 解析NA和NS报文中DAD报文保存设备mac和ipv6地址信息3.2.1 open_ns_na_socket3.2.2 recv_ns_na_pack 四、代码优化4.1 BPF参考学习资料4.2 代码…

DSSAT作物模型建模方法与进阶基于Python语言快速批量运行DSSAT模型及交叉融合、扩展应用技术应用

随着数字农业和智慧农业的发展&#xff0c;基于过程的作物生长模型&#xff08;Process-based Crop Growth Simulation Model&#xff09;在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。Decisi…

跨境卖家必看!TikTok带货经验分享,TikTok直播带货怎么做?

如今直播带货正发展得如火如荼&#xff0c;不少跨境人也纷纷做起了带货&#xff0c;其中TikTok带货的力量不容小觑&#xff0c;也已经成为了跨境电商运营非常火爆的营销方式&#xff0c;有很多朋友问龙哥TikTok带货怎么做&#xff0c;其实以龙哥这么多年的经验来看&#xff0c;…

智能物联网汽车3d虚拟漫游展示增强消费者对品牌的认同感和归属感

汽车3D虚拟展示系统是一种基于web3D开发建模和VR虚拟现实技术制作的360度立体化三维汽车全景展示。它通过计算机1:1模拟真实的汽车外观、内饰和驾驶体验&#xff0c;让消费者在购车前就能够更加深入地了解车辆的性能、特点和设计风格。 华锐视点云展平台是一个专业的三维虚拟展…

JRT打印元素绘制协议整合PDF

打印不光要能打印内部的单据&#xff0c;对于检验的打印还有外送回传的PDF报告也需要能够打印&#xff0c;所以需要把打印PDF文件整合进来&#xff0c;为此给打印元素绘制协议增加PDF类型的元素。 定义如下&#xff0c;由绘制协议按地址下载文件后和其他打印元素整合&#xff…

【BEV感知】BEVFormer 融合多视角图形的空间特征和时序特征 ECCV 2022

前言 本文分享BEV感知方案中&#xff0c;具有代表性的方法&#xff1a;BEVFormer。 它基于Deformable Attention&#xff0c;实现了一种融合多视角相机空间特征和时序特征的端到端框架&#xff0c;适用于多种自动驾驶感知任务。 主要由3个关键模块组成&#xff1a; BEV Que…

14 v-model绑定输入框

概述 v-model用于实现双向数据绑定&#xff0c;使用v-model绑定输入框是Vue3中最常见的用法之一。 比如&#xff0c;在制作登录界面的时候&#xff0c;我们会使用v-model绑定用户名和密码&#xff0c;这里的用户名和密码都是输入框。 基本用法 我们创建src/components/Demo…

基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI+Vant 电影院订票管理系统 的设计与实现

一.项目介绍 基于SpringBootVue 电影院订票管理系统 分为前端和后端。 前端&#xff08;用户&#xff09;&#xff1a; 登录后支持查看首页、电影、影院和我的信息 支持查看正在热映和即将上映的电影信息 支持购票&#xff08;需选择影院座位&#xff09;、看过&#xff08;评论…

接口测试和测试用例分析

只要有软件产品的公司百分之九十以上都会做接口测试&#xff0c;要做接口测试的公司那是少不了接口测试工程师的&#xff0c;接口测试工程师相对于其他的职位又比较轻松并且容易胜任。如果你想从事接口测试的工作那就少不了对接口进行分析&#xff0c;同时也会对测试用例进行研…

error while writing to output stream

unable to start device cairo_pdf 报错一般2种原因&#xff1a; 1.文件路径错误 2. 有其他软件打开文件导致不能写入

EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(三)FEEMD

往期精彩内容&#xff1a; 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff08;三&#xff09;EMD-LSTM-Attention模型-CSDN博客 风速预测&#xff08;四&#xf…

STM32/STM8资源节约主义编程方式

STM32/STM8资源节约主义编程方式 在小资源芯片进行代码设计时&#xff0c;如STM32C0系列&#xff0c;STM8系列&#xff0c;因为官方库本身要包含各种场景应用特征的支持&#xff0c;所以会有一些冗余的代码占用更多FLASH空间。当需要实现资源占用最简化设计方式时&#xff0c;…

Android年份选择器(超简单-可直接复制使用)

效果图 思路 1、流程&#xff1a; 通过点击textview触发年份选择器dialog显示&#xff0c;选中年份后&#xff0c;更新到textview。 2、如何只显示年份&#xff1f; 隐藏月份和天数即可&#xff08;但仍需给一个初始化数据&#xff09;。 实现 1、直接新建一个工具类OnPickY…

实时天气预警信息API:全面提供各种天气灾害预警

前言 随着气候变化的不断加剧&#xff0c;天气灾害成为大家关注的焦点。人们对于天气信息的获取需求越来越大&#xff0c;特别是在天气灾害发生时&#xff0c;及时、准确的天气预警信息能够极大地帮助人们做好防范准备&#xff0c;减少灾害带来的损失。为了满足这一需求&#…

去掉乘法运算的加法移位神经网络架构

[CVPR 2020] AdderNet: Do We Really Need Multiplications in Deep Learning? 代码&#xff1a;https://github.com/huawei-noah/AdderNet/tree/master 核心贡献 用filter与input feature之间的L1-范数距离作为“卷积层”的输出为了提升模型性能&#xff0c;提出全精度梯度…

鸿蒙 - arkTs:快速开始

index.ets文件理解&#xff1a; 新建模拟器&#xff1a; 1. 找到并打开设备管理器 2. 点击新建模拟器 3. 选择硬件之后下一步 4. 选择系统镜像&#xff0c;没有安装的话需要先安装 5. 设置模拟设备名称并点击完成 6. 提示创建成功代表刚才创建的模拟设备可以进行使用了…

【实战】如何在Docker Image中轻松运行MySQL

定义 使用Docker运行MySQL有许多优势。它允许数据库程序和数据分离&#xff0c;增强了数据的安全性和可靠性。Docker Image的轻便性简化了MySQL的部署和迁移&#xff0c;而Docker的资源隔离功能确保了应用程序之间无冲突。结合中间件和容器化系统&#xff0c;Docker为MySQL提供…

CentOs7.x安装部署SeaTunnelWeb遇到的坑

CentOs7.x安装部署SeaTunnelWeb遇到的坑 文章目录 1. 环境2. SeaTunnel安装部署2.1下载安装包2.2 设置环境变量2.3 安装连接器插件2.4 拷贝jar包到lib下2.5 启动命令2.6 执行官方client提交任务demo 3. SeaTunnel-Web安装部署3.1 下载安装包3.2 初始化数据库脚本或修改配置appl…