zoukankan      html  css  js  c++  java
  • oracle定时器job的使用

    对于DBA来说,数据库Job再熟悉不过了,因为经常要数据库定时的自动执行一些脚本,或做数据库备份,或做数据的提炼,或做数据库的性能优化,包括重建索引等等的工作。但是,Oracle定时器Job时间的处理上,千变万化,今天我把比较常用写法汇总如下:
    在总结之前,先把Job的参数一一说明一下
    1.创建job 创建完job后名字显示的是jobno 可用于启动和删除job

    declare

    job_OpAutoDta pls_integer;
    begin
      sys.dbms_job.submit(job =>job_OpAutoDta,  --job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作

      what => 'wsbs_job_produce_test;',   --what参数是将被执行的PL/SQL代码块,这里过程要带分号 ;

      next_date => to_date('04-08-2018 00:01:00', 'dd-mm-yyyy hh24:mi:ss'),--next_date参数指识何时将运行这个工作。写Job的时候可以不指定该值,不指定值的时候创建job会立即执行

      interval => 'sysdate+1'); --interval参数何时这个工作将被重执行,其中Interval这个值是决定Job何时,被重新执行的关键

      commit;

    end;

    2.运行job

    begin
       dbms_job.run(job_OpAutoDta);--job
    end;

    3.查询job

    --查询所有的job 查询到的job的id 可用来删除job

    select * from dba_job

    --查询正在运行的job

    select * from dba_jobs_running

    4.删除job

    begin
      dbms_job.remove(jobno);  --jobno即查询出来的job id
      commit;
    end;

    5.常用的日期Interval

    Internal参数是一个表示Oracle合法日期表达式的字符串。这个日期字符串的值在每次任务被执行时算出,算出的日期表达式有两种可能,要么是未来的一个时间要么就是null。这里要强调一点:很多开发者都没有意识到next_date是在一个任务开始时算出的,而不是在任务成功完成时算出的。

    当任务成功完成时,系统通过更新任务队列目录表将前面算出的next_date值置为下一次任务要运行的时间。当由interval表达式算出next_date是null时,任务自动从任务队列中移出,不会再继续执行。因此,如果传递一个null值给interval参数,则该任务仅仅执行一次。

    sysdate+1/24     --这个是间隔一个小时

    sysdate+1         --这个是间隔一天

    sysdate+7         --这个是间隔一个星期

    'TRUNC(SYSDATE + 1)'         每天午夜12点

    'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'    每星期二中午12点

    'TRUNC(LAST_DAY(SYSDATE ) + 1)'     每个月第一天的午夜12点

    'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24' 每个季度最后一天的晚上11点

    'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'

    6每半年定时执行 如:每年7月1日和1月1日凌晨2点 

    Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24

    6.

    • 8、相关的几个JOB操作
    •  
      删除job:dbms_job.remove(jobno);
    •  
      修改要执行的操作: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

      1,查询正在运行的Job,通过查询有两个,和进程占用较多的是两个ORACLE进程符合。
      SQL> SELECT SID,JOB FROM DBA_JOBS_RUNNING;
      SID JOB
      ---------- ----------
      12 116
      16 117
      2,查询正在运行的job的信息
      SQL> SELECT SID,SERIAL# FROM V$SESSION WHERE SID='12';
      SID SERIAL#
      ---------- ----------
      12 4
      SQL> SELECT SID,SERIAL# FROM V$SESSION WHERE SID='16';
      SID SERIAL#
      ---------- ----------
      16 1
      3,利用查询出来的job信息将job结束掉
      SQL> ALTER SYSTEM KILL SESSION '12,4';
      System altered.
      SQL> ALTER SYSTEM KILL SESSION '16,1';
      System altered.
      4,如果不希望运行上述job的话,可以将job设置为broken.
      EXEC DBMS_JOB.BROKEN(116,TRUE);
      EXEC DBMS_JOB.BROKEN(117,TRUE);

    
    
    
    
     
  • 相关阅读:
    切换RequiredFieldValidator和RegularExpressionValidator提示信息的控件
    添加删除查询字符串中的参数
    动易订单数据表关系
    页面中文乱码问题收集(原创)
    URLRewrite 在 iis6+iis7中的配置
    ASP.NET面试题(英文)
    execve
    pipe管道通信阻塞
    pipe
    linux管道通信
  • 原文地址:https://www.cnblogs.com/weiyi1314/p/9414616.html
Copyright © 2011-2022 走看看