视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
oracle job详解
2025-09-22 17:33:33 责编:小OO
文档
详解 Oracle job 的使用与管理技巧(2008-05-21 23:49:06)

SVRMGR> select * from dba_jobs;

初始化相关参数job_queue_processes

alter system set job_queue_processes=39 scope=spfile;//最大值不能超过1000 ; job_queue_interval = 10 //调度作业刷新频率秒为单位

select job,what,to_char(last_date,'yyyy-mm-dd

HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:mi:ss'),interval

from dba_jobs where job in (325,295)

select job,what,last_date,next_date,interval

from dba_jobs where job in (1,3);

查询job的情况。

show paramter background_dump_dest.

看alter.log 和trace

1. 停止一个JOB

SQL> exec dbms_job.broken(1,true)

SQL>commit

2. 启动job作业

SQL> exec dbms_job.broken(1,false)

3. 停其他用户的job

SQL>exec sys.dbms_ijob.broken(98,true);

SQL>commit;

============================exec dbms_job.broken(:job) 停止

exec dbms_job.broken(186,true) //标记位broken

exec dbms_job.broken(186,false)//标记为非broken

exec dbms_job.broken(186,false,next_day(sysdate,'monday')) //标记为非broken,指定执行时间

exec dbms_job.remove(:job);删除

exec dbms_job.remove(186);

commit;

三、查看相关job信息

相关视图

dba_jobs

all_jobs

user_jobs

dba_jobs_running 包含正在运行job相关信息

创建JOB

variable jobno number;

begin

dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/24,'HH'),

'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);

commit;

end;

print jobno例如,我们已经建立了一个存储过程,其名称为my_job,在sql/plus中以scott用户身份登录,执行如下命令:

sql> variable n number;

sql> begin

dbms_job.submit(:n,'my_job;',sysdate, 'sysdate+1/360');

commit;

end;

Sql> print :n;

系统提示执行成功。

Sql> print :n;

系统打印此任务的编号,例如结果为300。

一个简单例子

创建测试表

SQL> create table TEST(a date);

表已创建。

创建一个自定义过程

SQL> create or replace procedure MYPROC as

2 begin

3 insert into TEST values(sysdate);

4 end;

5 /过程已创建。

创建JOB

SQL> variable job1 number;

SQL>

SQL> begin

2 dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');

3 end;

4 /

PL/SQL 过程已成功完成。

运行JOB

SQL> begin

2 dbms_job.run(:job1);

3 end;

4 /

PL/SQL 过程已成功完成。

SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from TEST; 时间

-------------------

2001/01/07 23:51:21

2001/01/07 23:52:22

2001/01/07 23:53:24删除JOB

SQL> begin

2 dbms_job.remove(:job1);

3 end;

4 /

PL/SQL 过程已成功完成。

=================================

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

sql>begin

sql>dbms_job.run(:jobno) 该jobno为submit过程提交时返回的job number sql>end;

sql>/

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

sql>begin

sql>dbms_job.broken (:job,false,next_date)

sql>end;

sql>/

================================== SQL> create table a(a date);Table created

创建一个过程

SQL> create or replace procedure test as

2 begin

3 insert into a values(sysdate);

4 end;

5 /

Procedure created

提交JOB作业

SQL> declare

2 job1 number; //定义一个数字型变量

3 begin

4 dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440'); //按分钟算一天1440分钟

5 end;

6 /

PL/SQL procedure successfully completed

job1

---------

4

SQL> commit;

Commit complete

运行JOB作业

SQL> begin

2 dbms_job.run(4);

3 end;

4 /

PL/SQL procedure successfully completed

删除JOB作业

SQL> begin

2 dbms_job.remove(4);

3 end;

4 /

PL/SQL procedure successfully completed

SQL> commit;

Commit complete

修改JOB作业

execute dbms_job.change(186,null,null,'sysdate+3'); execute dbms_job.change(186,'scott.test(update)');DBA_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块

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)’

每天早上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)’

一、设置初始化参数 job_queue_processes

sql> alter system set job_queue_processes=n;(n>0) job_queue_processes最大值为1000

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

二,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说明此工作将标记为破,而FLASE说明此工作将标记为未破。

网管下载dl.bitscn.com

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

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

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

sql>begin

sql>dbms_job.run(:jobno) 该jobno为submit过程提交时返回的job number

sql>end;

sql>/

b、利用dbms_job.broken()重新将broken标记为falsesql>begin

sql>dbms_job.broken (:job,false,next_date)

sql>end;

sql>/

2、Change()过程用来改变指定工作的设置。

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

PROCEDURE Change (job IN binary_integer,

What IN varchar2,

next_date IN date,

interval IN varchar2)

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

What参数是由此工作运行的一块PL/SQL代码块。

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

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

网管联盟bitsCN@com

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

PROCEDURE Interval (job IN binary_integer,

Interval IN varchar2)

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

4、ISubmit()过程用来用特定的工作号提交一个工作。这个过程有五个参数:job、what、next_date、interval与no_parse。

PROCEDURE ISubmit (job IN binary_ineger,

What IN varchar2,

next_date IN date,

interval IN varchar2,

no_parse IN booean:=FALSE)

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

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

PROCEDURE Next_Date(job IN binary_ineger,

next_date IN date)

网管网www_bitscn_com

job标识一个已存在的工作。next_date参数指示了此工作应被执行的日期与时间。

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

PROCEDURE Remove(job IN binary_ineger);

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

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

PROCEDURE Run(job IN binary_ineger)

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

8、使用Submit()过程,工作被正常地计划好。

这个过程有五个参数:job、what、next_date、interval与no_parse。

PROCEDURE Submit ( job OUT binary_ineger,

What IN varchar2,

next_date IN date,

interval IN varchar2,

no_parse IN booean:=FALSE)

job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作。

what参数是将被执行的PL/SQL代码块。中国网管联盟bitsCN.com

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

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

no_parse参数指示此工作在提交时或执行时是否应进行语法分析——TRUE指示此

PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。

9、User_Export()过程返回一个命令,此命令用来安排一个存在的工作以便此工作能重新提交。

此程序有两个参数:job与my_call。

PROCEDURE User_Export(job IN binary_ineger,

my_call IN OUT varchar2)

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

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

PROCEDURE What (job IN binary_ineger,

What IN OUT varchar2)

job参数标识一个存在的工作。what参数指示将被执行的新的PL/SQL代码。

三、查看相关job信息

1、相关视图

dba_jobs

all_jobs

user_jobs

dba_jobs_running 包含正在运行job相关信息

网管网www_bitscn_com

2、查看相关信息

SQL>SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN

SQL>FROM DBA_JOBS;

JOB NEXT_DATE NEXT_SEC FAILURES B

------- --------- -------- -------- -

9125 01-JUN-01 00:00:00 4 N14144 24-OCT-01 16:35:35 0 N

9127 01-JUN-01 00:00:00 16 Y

3 rows selected.

正在运行的JOB相关信息

SELECT SID, r.JOB, LOG_USER, r.THIS_DATE, r.THIS_SEC FROM DBA_JOBS_RUNNING r, DBA_JOBS j

WHERE r.JOB = j.JOB;

SID JOB LOG_USER THIS_DATE THIS_SEC

----- ---------- ------------- --------- --------

12 14144 HR 24-OCT-94 17:21:24

25 8536 QS 24-OCT-94 16:45:12

2 rows selected.

JOB QUEUE LOCK相关信息

SELECT SID, TYPE, ID1, ID2

FROM V$LOCK

WHERE TYPE = 'JQ';

SID TY ID1 ID2

--------- -- --------- ---------

12 JQ 0 14144

1 row selected.

四、简单例子

一个简单例子:

网管网www_bitscn_com

创建测试表

SQL> create table TEST(a date);

表已创建。

创建一个自定义过程SQL> create or replace procedure MYPROC as

2 begin

3 insert into TEST values(sysdate);

4 end;

5 /

过程已创建。

创建JOB

SQL> variable job1 number;

SQL>

SQL> begin

2 dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440'); --每天1440分钟,即一分钟运行test过程一次

3 end;

4 /

PL/SQL 过程已成功完成。

运行JOB

SQL> begin

2 dbms_job.run(:job1);

3 end;

4 /

PL/SQL 过程已成功完成。

SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from TEST;

时间

-------------------

2001/01/07 23:51:21

2001/01/07 23:52:22

2001/01/07 23:53:24

删除JOB

SQL> begin

2 dbms_job.remove(:job1);3 end;

4 /

网管bitscn_com

PL/SQL 过程已成功完成。下载本文

显示全文
专题