job 创建-删除-定时

来源:互联网 发布:判断字符串像素长度js 编辑:程序博客网 时间:2024/03/29 06:23

   通常job的存在就是为了能够定时跑存储过程,存储过程是为了往数据库里面插入数据。执行某些操作。

创建一个job

 variable job_HNKYALL_AIRPORT_RANK_Y number;   begin   sys.dbms_job.submit(job => :job_HNKYALL_AIRPORT_RANK_Y,                     what =>'HNKYALL_AIRPORT_RANK_Y;',                     next_date =>trunc(ADD_MONTHS(SYSDATE,12),'yyyy')+1,                     interval =>'ADD_MONTHS(trunc(sysdate,''yyyy''),12)+12/24'                     );  commit;    end; 

其中job_HNKYALL_AIRPORT_RANK_Y 自定义命名。

what =>'HNKYALL_AIRPORT_RANK_Y;'  这个是要执行的存储过程,记得单引号和分号。 这里的存储过程需要先进行创建。

next_date =>trunc(ADD_MONTHS(SYSDATE,12),'yyyy')+1,   下次执行的时间。2016/1/2

interval =>interval =>'ADD_MONTHS(trunc(sysdate,''yyyy''),12)+12/24'(切记其中 yyyy的引号 是单引号连续输两次,而非双引号。是单引号的转义)循环执行的周期,这个是要加引号的。

select '''' from dual;    -- 这是1个单引号select '''''' from dual;   -- 这是2个单引号

这个程序在命令窗口 执行,直接打开  pl/sql   command Window 复制粘贴。 程序末尾 输入 / 来执行该程序。   

查询job

SELECT *  from user_jobs  
 --正在运行的job  这个需要在dba权限下查看。    select * from dba_jobs_running;  

首次运行

begin    dbms_job.run(id);   end;
这里的id 指的 查出的job号

删除时需要先查看到该job 的job_number

删除job 

begin dbms_job.remove (id);end;

如果已运行的job,需要先停止job再进行删除

EXEC  DBMS_JOB.BROKEN(id,TRUE)

如果发现 job虽然被删除了但是仍然在运行 只能去干掉session

比如 sid=183 job=81 的结果查询 select  sid,serial# from v$session where sid=183183 ,3643查询到结果通过 alter system kill session "183,3643"

重要的就是job 的周期运行:

描述                              INTERVAL参数值
每天午夜12点                 TRUNC(SYSDATE + 1)
每天早上8点30分             TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)
每星期二中午12点            NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24
每个月第一天的午夜12点        TRUNC(LAST_DAY(SYSDATE ) + 1)
每个季度最后一天的晚上11点     TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24
每星期六和日早上6点10分        TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)

每秒钟执行次

Interval => sysdate + 1/(24 * 60 * 60)

如果改成sysdate + 10/(24 * 60 * 60)就是10秒钟执行次

每分钟执行
Interval => TRUNC(sysdate,'mi') + 1/ (24*60)

如果改成TRUNC(sysdate,'mi') + 10/ (24*60) 就是每10分钟执行次

每天定时执行
例如:每天的凌晨1点执行
Interval => TRUNC(sysdate) + 1 +1/ (24)

每周定时执行
例如:每周一凌晨1点执行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24

每月定时执行
例如:每月1日凌晨1点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24

每季度定时执行
例如每季度的第一天凌晨1点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24

每半年定时执行
例如:每年7月1日和1月1日凌晨1点
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24

每年定时执行
例如:每年1月1日凌晨1点执行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24

转自:http://blog.sina.com.cn/s/blog_3f1dd8180100eh2p.html

    用过ORACLE的JOB的朋友也许都能够感觉到它的强大,和JAVA中的quartz有异曲同工之妙,可以少了很多的重复劳动;但是也会有许多问题,就是执行时间段和执行时间比较不容易确定。这其实都是我们还不熟悉JOB的interval造成的。

   我碰到过几种用JOB的情况,从简到烦说三种:

   1。最简单的,一个隔一段时间执行一次,没有其它限制。

interval:sysdate+2      每隔2天执行一次          sysdate+1/2    每隔12小时执行一次          sysdate+3/1440  每隔 3 分钟执行一次

    2。简单的定时执行。

          interval: trunc(sysdate+1)+1/3 每天的8点运行

   3。要定时间段执行的。

         interval: case whento_number(to_char(sysdate,'hh24'))>=8 andto_number(to_char(sysdate,'hh24'))<=20 thensysdate+15/1440 else trunc(sysdate+1)+1/3 end

        每天的8点到20点之点,每隔15分钟运行一次。

         case when to_number(to_char(sysdate,'mm'))>=6 andto_number(to_char(sysdate,'mm'))<=10 thentrunc(sysdate+30) else trunc(sysdate+1)+1/6 end

           6-10月份,每隔30天的凌晨开始运行,其余月份每隔一天早上4点运行

 

 


0 0
原创粉丝点击