原创

Oracle DB JOB使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://xxlcube.blog.csdn.net/article/details/8349820

使用job前,先创建一个存储过程,然后这个job就可以重复的调用这个存储过程了

SELECT   * FROMbook;

创建一个job,每个5秒去给书的价格低于50的,就X1.1,价格高于50的,就X0.9,目的就是job运行一段时间以后,所有书的价格都接近50了

CREATE OR REPLACE PROCEDURE changeprice

AS

BEGIN

   DECLARE

      h          NUMBER := 1.1;

      l          NUMBER := 0.9;

 

      CURSOR book_cur

      IS

         SELECT   * FROMbook;

 

      book_row   book_cur%ROWTYPE;

   BEGIN

      FOR book_row IN book_cur

      LOOP

         EXIT WHEN book_cur%NOTFOUND;

 

         UPDATE   book

            SET   money = money * h

          WHERE   money < 50;

 

         UPDATE   book

            SET   money = money * l

          WHERE   money > 50;

 

         COMMIT;

      END LOOP;

   END;

END;

创建JOB

DECLARE

   jobnum   NUMBER;

BEGIN

   DBMS_JOB.submit (jobnum,

                    'changeprice;',

                    TRUNC (SYSDATE) + 5/86400,

                    'sysdate');

END;

只有在创建之后,才能知道这个JOB的唯一标示码

执行JOB

EXEC dbms_job.run(82);

停止

EXEC dbms_job.broken(82,true);

 以上是实例演示


Job相关的视图

dba_jobsall_jobsuser_jobsdba_jobs_running

以下是常用的参数说明:

字段(列)          类型                描述 
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 
CURRENT_SESSION_LABEL RAW         MLSLABEL
该任务的信任Oracle会话符 
CLEARANCE_HI      RAW MLSLABEL    
该任务可信任的Oracle最大间隙 
CLEARANCE_LO     RAW             MLSLABEL
该任务可信任的Oracle最小间隙 
NLS_ENV          VARCHAR2(2000)  
任务运行的NLS会话设置 
MISC_ENV         RAW(32)         
任务运行的其他一些会话参数


描述                   INTERVAL参数值 
每天午夜12           'TRUNC(SYSDATE + 1)' 
每天早上830        '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' 
每星期六和日早上610   'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE,"SUNDAY"))) + 6×60+10/24×60'

 

 

一、设置初始化参数 job_queue_processes
sql> alter system set job_queue_processes=n;n>0
job_queue_processes最大值为1000

  查看job queue 后台进程
sql>select name,descriptionfrom v$bgprocess;

二、dbms_job package 用法介绍
  包含以下子过程: 

Broken()过程。
change()过程。
Interval()过程。
Isubmit()过程。
Next_Date()过程。
Remove()过程。
Run()过程。
Submit()过程。
User_Export()过程。
What()过程。

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

PROCEDURE Broken (job INbinary_integer,
BrokenIN boolean,
next_date IN date :=SYSDATE)

job参数是工作号,它在问题中唯一标识工作。
broken参数指示此工作是否将标记为破——TRUE说明此工作将标记为破,而FLASE说明此工作将标记为未破。 

next_date参数指示在什么时候此工作将再次运行。此参数缺省值为当前日期和时间。
job如果由于某种原因未能成功之行,oracle将重试16次后,还未能成功执行,将被标记为broken重新启动状态为brokenjob,有如下两种方式;
a、利用dbms_job.run()立即执行该job
sql>begin
sql>dbms_job.run(:jobno) jobnosubmit过程提交时返回的job number
sql>end;
sql>/
b、利用dbms_job.broken()重新将broken标记为false
sql>begin
sql>dbms_job.broken (:job,false,next_date)
sql>end;
sql>/
2Change()过程用来改变指定工作的设置。
  这个过程有四个参数:jobwhat next_dateinterval

PROCEDURE Change (jobINbinary_integer,
What IN varchar2,
next_dateIN date,
interval INvarchar2)

  此job参数是一个整数值,它唯一标识此工作。
What参数是由此工作运行的一块PL/SQL代码块。
next_date参数指示何时此工作将被执行。
interval参数指示一个工作重执行的频度。中国.网管联盟 

3Interval()过程用来显式地设置重执行一个工作之间的时间间隔数。这个过程有两个参数:jobinterval

PROCEDURE Interval (jobINbinary_integer,
Interval IN varchar2)

job参数标识一个特定的工作。interval参数指示一个工作重执行的频度。

4ISubmit()过程用来用特定的工作号提交一个工作。这个过程有五个参数:jobwhatnext_dateintervalno_parse

PROCEDURE ISubmit (job IN binary_ineger,
WhatIN varchar2,
next_date IN date,
intervalINvarchar2,
no_parseINbooean:=FALSE)

  这个过程与Submit()过程的唯一区别在于此job参数作为IN型参数传递且包括一个由开发者提供的工作号。如果提供的工作号已被使用,将产生一个错误。

5Next_Date()过程用来显式地设定一个工作的执行时间。这个过程接收两个参数:jobnext_date

PROCEDURE Next_Date(job INbinary_ineger,
next_date IN date)bitscn.com 
job标识一个已存在的工作。next_date参数指示了此工作应被执行的日期与时间。

6Remove()过程来删除一个已计划运行的工作。这个过程接收一个参数:

PROCEDURE Remove(job INbinary_ineger);

job参数唯一地标识一个工作。这个参数的值是由为此工作调用Submit()过程返回的job参数的值。已正在运行的工作不能由调用过程序删除。

7Run()过程用来立即执行一个指定的工作。这个过程只接收一个参数:

PROCEDURE Run(job IN binary_ineger) 

job参数标识将被立即执行的工作。

8、使用Submit()过程,工作被正常地计划好。
  这个过程有五个参数:jobwhatnext_dateintervalno_parse

PROCEDURE Submit ( job OUTbinary_ineger,
WhatINvarchar2,
next_date INdate,
intervalINvarchar2,
no_parseINbooean:=FALSE)

job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作。
what参数是将被执行的PL/SQL代码块。
next_date参数指识何时将运行这个工作。
interval参数何时这个工作将被重执行。
no_parse参数指示此工作在提交时或执行时是否应进行语法分析——TRUE指示此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。

9User_Export()过程返回一个命令,此命令用来安排一个存在的工作以便此工作能重新提交。
  此程序有两个参数:jobmy_call

PROCEDURE User_Export(jobIN binary_ineger,
my_callIN OUTvarchar2)

job参数标识一个安排了的工作。my_call参数包含在它的当前状态重新提交此工作所需要的正文。

10What()过程应许在工作执行时重新设置此正在运行的命令。这个过程接收两个参数:jobwhat

PROCEDURE What (jobINbinary_ineger,
What IN OUT varchar2)
job参数标识一个存在的工作。what参数指示将被执行的新的PL/SQL代码。

新建job

dbms_job.submit(

JOB       OUT BINARY_INTEGER,

WHAT      IN  VARCHAR2,

NEXT_DATE IN  DATE           DEFAULT SYSDATE,

INTERVAL  IN  VARCHAR2       DEFAULT 'NULL',

NO_PARSE  IN  BOOLEAN        DEFAULT FALSE,

INSTANCE  IN  BINARY_INTEGER DEFAULT 0,

FORCE     IN  BOOLEAN        DEFAULT FALSE);

 

例如:

declare

  jobnum number;

begin

  dbms_job.submit(jobnum,

                  'procedure1;',

                  trunc(SYSDATE+1)+1/24,

                  'sysdate+1');

end;

/

 

INTERVAL :

每天重复执行一次 'SYSDATE + 1'

每周重复执行一次 'SYSDATE + 7'

每小时重复执行一次 'SYSDATE + 1/24'

每十分钟重复执行一次 'SYSDATE + 10/1440'

每30秒重复执行一次 'SYSDATE + 30/86400'

不重复执行 NULL

执行job

EXEC dbms_job.run(175);

 中止、启动job

begin

  dbms_job.broken(294,TRUE);

end;

begin

  dbms_job.broken(294,FALSE);

end;

 调整Job的运行时间

BEGIN

  DBMS_JOB.next_date(495,next_date => to_date('20111029','yyyymmdd'));

END;

 调整Job

dbms_job.change(

job       IN BINARY_INTEGER,

what      IN VARCHAR2,

next_date IN DATE,

interval  IN VARCHAR2,

instance  IN BINARY_INTEGER DEFAULT NULL,

force     IN BOOLEAN        DEFAULT FALSE);

 

 

例如:exec dbms_job.change(14144, NULL, NULL, 'SYSDATE + 3');


 

文章最后发布于: 2012-12-20 14:40:54
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 酷酷鲨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览