安徽门户网站建设,个人网站百度推广收费,个人博客系统wordpress,十大不收费看盘软件排名下载在开始操作之前#xff0c;先从三W开始#xff0c;即我常说的what 是什么#xff1b;why 为什么使用#xff1b;how 如何使用。
一、Oracle定时器是什么
Oracle定时器是一种用于在特定时间执行任务或存储过程的工具#xff0c;可以根据需求设置不同的时间段和频率来执行…在开始操作之前先从三W开始即我常说的what 是什么why 为什么使用how 如何使用。
一、Oracle定时器是什么
Oracle定时器是一种用于在特定时间执行任务或存储过程的工具可以根据需求设置不同的时间段和频率来执行相应的操作。
二、为什么使用Oracle定时器
使用Oracle定时器的好处在于可以自动化执行重复性的任务比如每天、每周或每月执行一次数据库维护、数据备份等操作从而减轻了人工操作的负担提高了工作效率。
三、如何使用Oracle定时器
使用Oracle定时器的方法包括编写存储过程来定义需要执行的任务然后创建一个定时器Job来调度这个存储过程。可以根据具体需求设置定时器的执行时间、频率和其他参数以实现自动化执行任务的目的。 四、目前有哪些主流Oracle定时器有何区别
目前主流的Oracle定时器有两种DBMS_SCHEDULER和DBMS_JOB。它们之间有以下区别 1. DBMS_SCHEDULERDBMS_SCHEDULER是Oracle 10g及以上版本引入的定时器。它提供了更强大和灵活的功能可以创建和管理复杂的作业调度。DBMS_SCHEDULER使用了面向对象的方式来定义作业和调度器并且支持多种类型的作业如PL/SQL块、存储过程、外部脚本等。它还支持更多的调度选项如基于时间、日期、事件等触发器以及更灵活的重复调度设置。
2. DBMS_JOBDBMS_JOB是Oracle 9i及以下版本中使用的定时器。它相对简单只能调度PL/SQL块作业。DBMS_JOB使用了过程式的方式来定义作业和调度器调度选项相对较少只能基于时间间隔来触发作业。此外DBMS_JOB的调度信息存储在数据库中的JOB表中。
总的来说DBMS_SCHEDULER比DBMS_JOB更强大和灵活适用于复杂的作业调度需求。而DBMS_JOB则更简单适用于简单的定时任务。 介绍了概念接下来是实际使用参考自蒋老师的文章感谢蒋老师的分享和归纳——
oracle 定时任务 (yuque.com)https://www.yuque.com/ernanbei/fh8sgs/fn20rxtaosmfdfnq?singleDoc#最常见的定时场景就是周期性统计动态变化的数据以我为例我需要在项目中加入一个Oracel定时器每三分钟统计一次数据那首先得写一个函数用于操作数据的读取和存储其次是设置定时器通过定时器定时周期性调度执行该函数从而实现数据的周期性的获取。
1、函数的编写
create PROCEDURE SYNCHRONIZE_HONORING_HISTORY
ASV_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_IDfrom (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_IDfrom (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_IDfrom (select APPLY_RECORD_ID,COMMENDATION_ID,UPDATE_DATE,BASE_DEPT_IDfrom DIAN_COMMENDATION_APPLY_RECORD Awhere APPLY_STATUS APPROVEDand UPDATE_DATE trunc(sysdate)and UPDATE_DATE trunc(sysdate 1)) Aleft join (select SOURCE_ID, USER_ID, SCORE,USER_ACCOUNT_IDfrom DIAN_COMMENDATION_DISTRIBUTE_RECORD DRwhere DR.CREATION_DATE trunc(sysdate)and DR.CREATION_DATE trunc(sysdate 1)) Bon a.APPLY_RECORD_ID B.SOURCE_IDleft join DIAN_COMMENDATION Con A.COMMENDATION_ID c.COMMENDATION_IDleft join (select A.USER_ID,A.NAME,B.USER_ACCOUNT_IDfrom DIAN_USER_EXPAND Aleft join DIAN_USER_ACCOUNT bon a.USER_IDb.USER_ID) Don B.USER_ID D.USER_IDand B.USER_ACCOUNT_ID D.USER_ACCOUNT_IDleft join (select DICT_VALUE, DICT_KEYfrom DIAN_DICTIONARY_MAPwhere DICT_TYPE COMMENDATION_SOURCEand IS_ENABLE 1) Eon E.DICT_KEY c.COMMENDATION_SOURCEleft join (select DICT_VALUE, DICT_KEYfrom DIAN_DICTIONARY_MAPwhere DICT_TYPE COMPETENCE_DIMENSIONand IS_ENABLE 1) Fon F.DICT_KEY c.COMPETENCE_DIMENSIONgroup 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_JOBLOOP-- 判断数据是否存在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 THENV_COUNT_2 : V_COUNT_2 1;ELSEV_COUNT_2 : 0;COMMIT;END IF;END IF;END LOOP;COMMIT;
EXCEPTIONWHEN OTHERS THENROLLBACK;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), --每天830执行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应用成功啦