当前位置:   article > 正文

Oracle定时任务DBMS_JOB_oracle dbms_job

oracle dbms_job

目录

引言

需求

示例

第一步:创建存储过程

第二步:创建定时任务job

第三步:启动定时任务job

测试:数据测试


引言

       开发中定制定时执行的任务有两种方式,代码级别和数据库级别,代码级别的不多阐述,本文主要介绍如何使用Oracle数据库的job来定制一个简单的定时执行任务的步骤。

需求

       每间隔1秒钟删除表 batchs_lock 中锁定时间(字段为lock_time)大于等于一分钟的所有记录(也就是字段 lock_time 的时间值与系统当前时间相差1分钟的所有记录),表结构如下:

  1. --------------批次表
  2. create table ecm_batchs_lock
  3. (
  4.   application_no       varchar2(20) not null,
  5.   org_code             varchar2(10) not null,
  6.   lock_time            timestamp(6) not null
  7. );
  8. -- create/recreate primary, unique and foreign key constraints 
  9. alter table ecm_batchs_lock
  10.   add constraint application_no primary key (application_no)
  11.   using index;

示例

废话不多说,直接上例子:

第一步:创建存储过程

  1. create or replace procedure ecm_batchs_lock_proce is
  2. begin
  3.   delete from ecm_batchs_lock e where e.lock_time<=sysdate-1/1440;
  4.   commit;
  5. end;

脚本讲解:

  1. create or replace procedure 存储过程名可随意取 is
  2. begin
  3.   此处编写要执行的脚本逻辑并以分号结尾不能忘;
  4.   commit;
  5. end;
  6. --------------------------------------------------------------
  7. PS:
  8. e.lock_time<=sysdate-1/1440; 表示1分钟前, 其中1440=60*24
  9. e.lock_time<=sysdate-30/1440; 则表示30分钟前
  10. 类推:
  11. e.lock_time<=sysdate-30/86400; 表示30秒前,其中86400=60*60*24
  12. ...

在如下图可查看到刚刚创建的存储过程:

第二步:创建定时任务job

  1. declare jobno number;
  2. begin
  3.   dbms_job.submit(jobno,'ecm_batchs_lock_proce;',sysdate,'sysdate+1/86400');
  4.   commit;
  5. end;

脚本讲解:

  1. declare 标志位随便写英文即可 number;
  2. begin
  3.   dbms_job.submit(同第一行的标志位,'存储过程名字切记分号不能忘;',sysdate,'sysdate+1/86400');
  4.   commit;
  5. end;
  6. --------------------------------------------------------------
  7. PS:
  8. sysdate+1/86400 表示每隔1秒钟执行一次,86400=60*60*24
  9. 类推:
  10. sysdate+1/1440 表示每隔1分钟执行一次,1440=60*24

然后,执行如下查询语句,在如下图可查看到创建好的job详细信息:

select * from dba_jobs;

第三步:启动定时任务job

(1)先查询存储过程 ecm_batchs_lock_proce 的 job 值是多少,其实上图中已经可以看到是74了:

select j.job as job from dba_jobs j where j.WHAT='ecm_batchs_lock_proce;'

脚本讲解:

select j.job as job from dba_jobs j where j.WHAT='存储过程名字;'

(2)将查询到的值代入如下脚本:

  1. begin
  2.   dbms_job.run(74);
  3.   commit;
  4. end;

脚本讲解:

dbms_job.run(查到的值);   可以理解为以id启动job。

启动完job后,在如下图可以看到:

选中后右键,即可进行查看、编辑、删除、启动等操作,如下图:

测试:数据测试

插入一条记录,等待一分钟后发现记录被删除,说明定时任务工作正常:

insert into ecm_batchs_lock(application_no, org_codelock_time)values('Br-A794596690''CA', sysdate);

一分钟后:

案例:

定时查询数据集再插入某张表:

  1. ----1------创建存储过程loan_after_check_procedure 创建后在Procedures中查看
  2. create or replace procedure loan_after_check_procedure is
  3. BEGIN
  4. ---2---查询出数据集合cs
  5. declare cursor cs is
  6. select max(t.task_end_datim),cfsv.NATIONAL_ORGANIZATION_CODE,cfsv.CL_APPLICATION_NUMBER,l.loan_id
  7. from contract_ocr c ,contract_bp bb ,bp_main_ocr mm,cl_fleet_summary_view cfsv,loan l,task t
  8. where c.contract_id=bb.contract_id
  9. and bb.business_partner_id = mm.business_partner_id
  10. and c.proposal_nbr = cfsv.APPLICATION_NUMBER
  11. and cfsv.CL_APPLICATION_NUMBER = l.application_no
  12. and l.loan_id = t.loan_id
  13. and t.pri_type='1' and t.flag='8' and t.task_status='5'
  14. and t.task_end_datim is not null
  15. --每月1号00:00:00执行 如2022-05-01 00:00:00 执行,查询出2021-06-01 00:00:00 到 2022-07-01 00:00:00之间的所有符合的单子
  16. and t.task_end_datim between (select add_months(sysdate, -11) from dual) and (select add_months(sysdate, -10) from dual)
  17. and bb.role_cde='00003'
  18. and mm.legal_status_cde='00002'
  19. and c.live_sts='L'
  20. group by cfsv.NATIONAL_ORGANIZATION_CODE,cfsv.CL_APPLICATION_NUMBER,l.loan_id;
  21. BEGIN
  22. ---3--遍历数据集合cs将制定字段插入指定表
  23. for cc in cs loop
  24. BEGIN
  25. INSERT INTO TASK(TASK_ID,LOAN_ID,PRI_TYPE,POSITION_ID,FLAG)
  26. ---select (select to_char(sysdate,'yyyymmddhhmmss') FROM DUAL)||(SELECT TRUNC(1000+9000*dbms_random.value) FROM dual) as str from dual 年月日时分秒+4位随机数拼接作为taskid,和代码逻辑一致
  27. VALUES((select (select to_char(sysdate,'yyyymmddhhmmss') FROM DUAL)||(SELECT TRUNC(1000+9000*dbms_random.value) FROM dual) as str from dual),cc.loan_id,'30','79','1');
  28. COMMIT;
  29. END;
  30. END loop;
  31. END;
  32. END;
  33. ----4----创建定时job(每月1日凌晨0点执行) 创建后在DBMS_Jobs中查看
  34. ---TRUNC(sysdate,''mi'')+1/(24*60) 每分钟执行一次
  35. ---TTRUNC(LAST_DAY(SYSDATE)+1) 每月1日凌晨0点执行
  36. ---TRUNC(LAST_DAY(SYSDATE))+1+1/24 每月1日凌晨1点执行
  37. declare jobno number;
  38. begin
  39. dbms_job.submit(jobno,'loan_after_check_procedure;',sysdate,'TTRUNC(LAST_DAY(SYSDATE)+1)');
  40. commit;
  41. end;

=================以上三步完成后,整个定时任务就创建并启动完成了,测试运行OK,是不是很简单,接下来就是按照自己实际需求作对应的修整了,快去试试=================

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/203591?site
推荐阅读
相关标签
  

闽ICP备14008679号