zoukankan      html  css  js  c++  java
  • Oracle Job定时任务的使用详解

    oracle中的job能为你做的就是在你规定的时间格式里执行存储过程,定时执行一个任务 。下面是一个小案例,定时每15分钟向一张表插入一条数据

    1.创建一张测试表

     1 -- Create table
     2 create table A8
     3 (
     4   a1 VARCHAR2(500)
     5 )
     6 tablespace DSP_DATA
     7   pctfree 10
     8   initrans 1
     9   maxtrans 255
    10   storage
    11   (
    12     initial 64K
    13     next 1M
    14     minextents 1
    15     maxextents unlimited
    16   );

    2.创建存储过程 实现向测试表插入数据

    1 create or replace procedure proc_add_test as
    2 begin
    3   insert into a8 values (to_char(sysdate, 'yyyy-mm-dd hh:mi'));/*向测试表插入数据*/
    4   commit;
    5 end;

    3.创建job定时任务  实现自动调用存储过程(当前时间 17:03)

     1 declare
     2   job number;
     3 BEGIN
     4   DBMS_JOB.SUBMIT(  
     5         JOB => job,  /*自动生成JOB_ID*/  
     6         WHAT => 'proc_add_test;',  /*需要执行的存储过程名称或SQL语句*/  
     7         NEXT_DATE => sysdate+3/(24*60),  /*初次执行时间-下一个3分钟*/  
     8         INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)' /*每隔1分钟执行一次*/
     9       );  
    10   commit;
    11 end;

    重要一点:很多人存储过程中有建表或删表语句,在执行job和存储过程时要有DDL权限,否则很可能执行不成功,在手动执行时出现这个:ORA-12011: 无法执行 1 作业,大多是没有权限

    grant dba to 用户名

    4.也就是应该从17:06开始 每隔1分钟执行一次存储过程   下面是截止17:12分的测试表的数据

    1.可以通过查询系统表查看该job信息

    1 select * from user_jobs;

     2.手动sql调用job   (直接调用job可以忽略开始时间)  在plsql中新建command window窗口,输入下列命令,或者新建test窗口直接粘贴下列命令

    begin
       DBMS_JOB.RUN(40); /*40 job的id*/
     end;

    3.删除任务  

    1 begin
    2   /*删除自动执行的job*/
    3   dbms_job.remove(40);
    4 end;

    4.停止job

    1 dbms.broken(job,broken,nextdate);   
    2 dbms_job.broken(v_job,true,next_date);        /*停止一个job,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。   */

    5.修改间隔时间

    1 dbms_job.interval(job,interval);

    6.修改下次执行时间

    1 dbms_job.next_date(job,next_date);

    7.修改要执行的操作 

    1 dbms_job.what(jobno,'sp_fact_charge_code;');  --修改某个job名

    三 其他知识

    1.存job信息的表user_jobs主要字段说明

    列名 数据类型 解释
    JOB NUMBER 任务的唯一标示号
    LOG_USER VARCHAR2(30) 提交任务的用户
    PRIV_USER VARCHAR2(30) 赋予任务权限的用户
    SCHEMA_USER VARCHAR2(30) 对任务作语法分析的用户模式
    LAST_DATE DATE 最后一次成功运行任务的时间
    LAST_SEC  VARCHAR2(8) 如HH24:MM:SS格式的last_date日期的小时,分钟和秒
    THIS_DATE DATE  正在运行任务的开始时间,如果没有运行任务则为null
    THIS_SEC VARCHAR2(8)  如HH24:MM:SS格式的this_date日期的小时,分钟和秒
    NEXT_DATE DATE 下一次定时运行任务的时间
    NEXT_SEC VARCHAR2(8) 如HH24:MM:SS格式的next_date日期的小时,分钟和秒
    TOTAL_TIME NUMBER 该任务运行所需要的总时间,单位为秒
    BROKEN VARCHAR2(1) 标志参数,Y标示任务中断,以后不会运行
    INTERVAL VARCHAR2(200) 用于计算下一运行时间的表达式
    FAILURES NUMBER 任务运行连续没有成功的次数
    WHAT  VARCHAR2(2000) 执行任务的PL/SQL块

    2.INTERVAL参数常用值示例

    1. 每天午夜12点            ''TRUNC(SYSDATE + 1)''     
    2. 每天早上8点30分         ''TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)''     
    3. 每星期二中午12点         ''NEXT_DAY(TRUNC(SYSDATE ), ''''TUESDAY'''' ) + 12/24''     
    4. 每个月第一天的午夜12点    ''TRUNC(LAST_DAY(SYSDATE ) + 1)''     
    5. 每个季度最后一天的晚上11点 ''TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ''Q'' ) -1/24''     
    6. 每星期六和日早上6点10分    ''TRUNC(LEAST(NEXT_DAY(SYSDATE, ''''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)''    
    7. 每3秒钟执行一次             'sysdate+3/(24*60*60)'   
    8. 每2分钟执行一次           'sysdate+2/(24*60)'   
    9.   
    10. 1:每分钟执行  
    11. Interval => TRUNC(sysdate,'mi') + 1/ (24*60) --每分钟执行  
    12. interval => 'sysdate+1/(24*60)'  --每分钟执行  
    13. interval => 'sysdate+1'    --每天  
    14. interval => 'sysdate+1/24'   --每小时  
    15. interval => 'sysdate+2/24*60' --每2分钟  
    16. interval => 'sysdate+30/24*60*60'  --每30秒  
    17. 2:每天定时执行  
    18. Interval => TRUNC(sysdate+1)  --每天凌晨0点执行  
    19. Interval => TRUNC(sysdate+1)+1/24  --每天凌晨1点执行  
    20. Interval => TRUNC(SYSDATE+1)+(8*60+30)/(24*60)  --每天早上8点30分执行  
    21. 3:每周定时执行  
    22. Interval => TRUNC(next_day(sysdate,'星期一'))+1/24  --每周一凌晨1点执行  
    23. Interval => TRUNC(next_day(sysdate,1))+2/24  --每周一凌晨2点执行  
    24. 4:每月定时执行  
    25. Interval =>TTRUNC(LAST_DAY(SYSDATE)+1)  --每月1日凌晨0点执行  
    26. Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24  --每月1日凌晨1点执行  
    27. 5:每季度定时执行  
    28. Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q')  --每季度的第一天凌晨0点执行  
    29. Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') + 1/24  --每季度的第一天凌晨1点执行  
    30. Interval => TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24  --每季度的最后一天的晚上11点执行  
    31. 6:每半年定时执行  
    32. Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24  --每年7月1日和1月1日凌晨1点  
    33. 7:每年定时执行  
    34. Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24  --每年1月1日凌晨1点执行 
  • 相关阅读:
    hdu 1269 迷宫城堡 (并查集)
    hdu 1272 小希的迷宫 (深搜)
    hdu 1026 Ignatius and the Princess I (深搜)
    hdu 1099 Lottery
    hdu 1068 Girls and Boys (二分匹配)
    几个基础数位DP(hdu 2089,hdu 3555,uestc 1307 windy 数)
    hdu 1072 Nightmare (广搜)
    hdu 1398 Square Coins (母函数)
    hdu 1253 胜利大逃亡 (深搜)
    hdu 1115 Lifting the Stone (求重心)
  • 原文地址:https://www.cnblogs.com/zl520/p/11752565.html
Copyright © 2011-2022 走看看