打开支付宝首页搜“523966799”领红包,领到大红包的小伙伴赶紧使用哦!

 找回密码
 立即注册

QQ登录

只需一步,快速开始

Oracle JOB详解

2023-6-2 16:08| 发布者: zhaojun917| 查看: 392| 评论: 0

摘要: Oraclejob有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。 而且oracle重新启动后,job会继续运行,不用重新启动。一、相关视图(1).dba_jobs显示的是所有用户下的job注:dba_jobs_running ...

Oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。 而且oracle重新启动后,job会继续运行,不用重新启动。

 

一、相关视图

(1).dba_jobs显示的是所有用户下的job

注:dba_jobs_running 可以查看正在运行的JOB

 

 

 

(2).user_jobs和all_jobs差不多,一般显示当前用户下的job。

 

2.视图的相关字段简要描述

SQL> desc dba_jobs;

 

Name

   Type

描述

 JOB

NUMBER

JOB唯一标识号

 LOG_USER

 VARCHAR2(128)

创建用户

 PRIV_USER

 VARCHAR2(128)

赋权用户

 SCHEMA_USER

 VARCHAR2(128)

方案名(一般等同于用户名)

 LAST_DATE

    DATE

最后一次成功执行job的日期

 LAST_SEC

    VARCHAR2(16)

最后一次成功执行job的日期(时分秒)

 THIS_DATE

    DATE

正在运行job的开始时间

 THIS_SEC

    VARCHAR2(16)

正在运行job的开始时间(时分秒)

 NEXT_DATE

 DATE

下一次执行的时间

 NEXT_SEC

    VARCHAR2(16)

下一次执行的时间(时分秒)

 TOTAL_TIME

    NUMBER

该任务预计运行多少秒

 BROKEN

    VARCHAR2(1)

JOB是否中断(停止Y/运行N)

 INTERVAL

VARCHAR2(200)

下次运行时间表达式

 FAILURES

    NUMBER

JOB连续失败次数

 WHAT

    VARCHAR2(4000)

执行job的对象名称

 NLS_ENV

    VARCHAR2(4000)

会话的字符集

 MISC_ENV

    RAW(32)

其他参数

 INSTANCE

    NUMBER

 

 

3.JOB的执行频率interval

         1.每天夜里24点                                         TRUNC(SYSDATE+1)

         2.每天上午9:20                                           TRUNC(SYSDATE+1)+(9*60+20)/(24*60)

         3.每周二下午1点                             NEXT_DAY(TRUNC(SYSDATE ), ''''TUESDAY'''' ) + 13/24

         4.每月15日夜里0点                                TRUNC(LAST_DAY(SYSDATE ) + 15)

         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.每分钟执行                    TRUNC(sysdate,'mi') + 1/ (24*60)

  interval => 'sysdate+1/(24*60)'  --每分钟执行 

  interval => 'sysdate+1'    --每天 

  interval => 'sysdate+1/24'   --每小时 

  interval => 'sysdate+2/24*60' --每2分钟 

  interval => 'sysdate+30/24*60*60'  --每30秒 

  10.每天定时执行 

  Interval => TRUNC(sysdate+1)  --每天凌晨0点执行 

  Interval => TRUNC(sysdate+1)+1/24  --每天凌晨1点执行 

  Interval => TRUNC(SYSDATE+1)+(8*60+30)/(24*60)  --每天早上8点30分执行 

  11.每周定时执行 

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

  Interval => TRUNC(next_day(sysdate,1))+2/24  --每周一凌晨2点执行 

  12.每月定时执行 

  Interval =>TTRUNC(LAST_DAY(SYSDATE)+1)  --每月1日凌晨0点执行 

  Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24  --每月1日凌晨1点执行 

  13.每季度定时执行 

  Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q')  --每季度的第一天凌晨0点执行 

  Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') + 1/24  --每季度的第一天凌晨1点执行 

  Interval => TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24  --每季度的最后一天的晚上11点执行 

  14.每半年定时执行 

  Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24  --每年7月1日和1月1日凌晨1点 

  15.每年定时执行 

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

        

二、JOB的创建

         语法:

declare

    variable job number;

begin

    sys.dbms_job.submit(job => :job,

    what => 'prc_name;',                          --执行的存储过程的名字

    next_date => to_date('22-11-201309:09:41', 'dd-mm-yyyy hh24:mi:ss'),

    interval =>'sysdate+1/86400');            --每天86400秒钟,即一秒钟运行prc_name过程一次

    commit;

end;

 

使用dbms_job.submit方法过程,这个过程有五个参数:job、what、next_date、interval与no_parse。

dbms_job.submit(

job       OUT binary_ineger,

What      IN varchar2,

next_date IN  date,

interval  IN varchar2,

no_parse  IN booean:=FALSE)

 

job参数是输出参数,由submit()过程返回的binary_ineger,这个值用来唯一标识一个工作。一般定义一个变量接收,可以去user_jobs视图查询job值。

what参数是将被执行的PL/SQL代码块,存储过程名称等。

next_date参数指识何时将运行这个工作。

interval参数何时这个工作将被重执行。

no_parse参数指示此工作在提交时或执行时是否应进行语法分析——true,默认值false。指示此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。

 

其他job相关的存储过程

 在dbms_job这个package中还有其他的过程:broken、change、interval、isubmit、next_date、remove、run、submit、user_export、what;

 

 大致介绍下这些过程:

1、broken()过程更新一个已提交的工作的状态,典型地是用来把一个已破工作标记为未破工作。这个过程有三个参数:job、broken与next_date。

           procedure broken (

                       job IN binary_integer,

                       broken IN boolean,

                       next_date IN date := SYSDATE

            )

 job参数是工作号,它在问题中唯一标识工作。

 broken参数指示此工作是否将标记为破——true说明此工作将标记为破,而false说明此工作将标记为未破。

 next_date参数指示在什么时候此工作将再次运行。此参数缺省值为当前日期和时间。

 

job如果由于某种原因未能成功执行,oracle将重试16次后,还未能成功执行,将被标记为broken,重新启动状态为broken的job,有如下两种方式;

 (1)利用dbms_job.run()立即执行该job

        begin

              dbms_job.run(:job) --该job为submit过程提交时返回的jobnumber或是去dba_jobs去查找对应job的编号

        end;

 

 (2)利用dbms_job.broken()重新将broken标记为false

         begin

              dbms_job.broken (:job, false, next_date)

          end;

 

2、change()过程用来改变指定job的设置。

这个过程有四个参数:job、what、next_date、interval。

          procedure change (

              job IN binary_integer,

               what IN varchar2,

              next_date IN date,

              interval IN varchar2

           )

 

这里,

job参数是一个整数值,它唯一标识此工作。

what参数是由此job运行的一块PL/SQL代码块。

next_date参数指示何时此job将被执行。

interval参数指示一个job重执行的频度。

上一篇:PLSQL设置中文下一篇:with as 用法
关闭

站长推荐上一条 /7 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )

GMT+8, 2024-9-20 02:27 , Processed in 0.022890 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.