ORACLE定时执行Job任务

今天改完了全部的bug,就想整个项目哪里有地方可以优化,哪里还存在需要补坑。

因为是统计周月数据,便想到了数据库定时Job任务创建。

在百度上,找到了一篇好文章,跟大家分享:http://langgufu.iteye.com/blog/1179235

另一篇文章是关于ORACLE时间间隔书写:https://blog.csdn.net/wangjiajiachengcheng/article/details/51335871

当然,过程中遇到了几个点,需要注意下:

1、我需要处理查询一个表的数据更新到另一张表数据,具体方法如下:https://blog.csdn.net/cyxinda/article/details/78254110

2、一般我们都调用存储过程,这里job声明时,显得代码简洁好看

一个简单例子: 

该例子来源第一篇文章,亲自在数据库操作的,发现有点小错误,改正后贴在这里:
1、创建测试表 
      create table a(a date); 


2、创建一个自定义存储过程 
      create or replace procedure test as 
      begin 
      insert into a values(sysdate); 
      end; 

3、创建JOB 
      declare  job1  number; 
      begin 
      dbms_job.submit(job1,'test;',sysdate,'sysdate+1/1440');----这里直接调用创建好的test存储过程
      commit; ----避免在plsql中点击提交按钮
      end;  

4、运行JOB (步骤三成功后,job就已经开始执行了)

      先查询定时任务job的id,sql语句:SELECT * FROM USER_JOBS或SELECT * FROM DBA_JOBS;

      

      根据ID,运行定时job任务
      begin 
      dbms_job.run(jobId); 

      commit;
      end; 

5、停止已启动的定时任务

      begin

               dbms_job.broken(25,  true,  sysdate);

      commit;

      end;

5、删除指定job

      -----查询任务id,删除定时任务,
      begin
               dbms_job.remove(jobId);

               commit;
      end;

6、修改Job执行参数

     修改要执行的操作Job:dbms_job.what(jobno,  what);   

     修改下次执行时间:dbms_job.next_date(job,  next_date);   

     修改间隔时间:dbms_job.interval(job,  interval);   

     停止Job:dbms.broken(job,  broken,  nextdate);   

     启动Job:dbms_job.run(jobno); 

注意点:复制粘贴代码在编译器内经常会不通过,所以建议遇到该类情况时,手写代码。

7、定制执行插入数据

7.1、每周五零点插入数据
         declare
         job_test  number:=6;
         begin
                  dbms_job.submit(job_test,  'insert into test(a,  b,  c)

                  values 

                  (1,  1,  1,  trunc(sysdate,'day')+5,  trunc(sysdate, 'day')+11, ''a'', ''a'');',  sysdate,  'trunc(next_day(sysdate, 6))+2/24');
         commit;
         end;


7.2、每天中午十二点查询上周五到本周四的数据并更新到表test
         declare 
         job_test  number:=10; 
         begin 
         dbms_job.submit(job_test,  'update test  set  total=(
         select  A  from(
         select  (sum(a) + to_number(to_char(systimestamp, ''mi'')))  as  A 
         from  table1
         where 
         date  between 
         trunc(sysdate, ''day'') - 2  and  trunc(sysdate, ''day'') + 4));',  sysdate,  'TRUNC(sysdate)+1+12/(24)'); 
         commit; 
         end; 

猜你喜欢

转载自blog.csdn.net/ysh598923879/article/details/81115549