一、设置初始化参数 job_queue_processessql> 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,BrokenIN boolean,next_date IN date :=SYSDATE)job参数是工作号,它在问题中唯一标识工作。broken参数指示此工作是否将标记为破——TRUE说明此工作将标记为破,而FLASE说明此工作将标记为未破。bitsCN.Comnext_date参数指示在什么时候此工作将再次运行。此参数缺省值为当前日期和时间。job如果由于某种原因未能成功之行,oracle将重试16次后,还未能成功执行,将被标记为broken重新启动状态为broken的job,有如下两种方式;a、利用dbms_job.run()立即执行该jobsql>beginsql>dbms_job.run(:jobno) 该jobno为submit过程提交时返回的job numbersql>end;sql>/b、利用dbms_job.broken()重新将broken标记为falsesql>beginsql>dbms_job.broken (:job,false,next_date)sql>end;sql>/2、Change()过程用来改变指定工作的设置。这个过程有四个参数:job、what 、next_date与interval。PROCEDURE Change (jobIN binary_integer,What IN varchar2,next_dateIN date,interval IN varchar2)此job参数是一个整数值,它唯一标识此工作。What参数是由此工作运行的一块PL/SQL代码块。next_date参数指示何时此工作将被执行。interval参数指示一个工作重执行的频度。 中国.网管联盟3、Interval()过程用来显式地设置重执行一个工作之间的时间间隔数。这个过程有两个参数:job与interval。PROCEDURE Interval (jobIN binary_integer,Interval IN varchar2)job参数标识一个特定的工作。interval参数指示一个工作重执行的频度。4、ISubmit()过程用来用特定的工作号提交一个工作。这个过程有五个参数:job、what、next_date、interval与no_parse。PROCEDURE ISubmit (job IN binary_ineger,WhatIN varchar2,next_date IN date,intervalIN varchar2,no_parseIN booean:=FALSE)这个过程与Submit()过程的唯一区别在于此job参数作为IN型参数传递且包括一个由开发者提供的工作号。如果提供的工作号已被使用,将产生一个错误。5、Next_Date()过程用来显式地设定一个工作的执行时间。这个过程接收两个参数:job与next_date。PROCEDURE Next_Date(job INbinary_ineger,next_date IN date) bitscn.comjob标识一个已存在的工作。next_date参数指示了此工作应被执行的日期与时间。6、Remove()过程来删除一个已计划运行的工作。这个过程接收一个参数:PROCEDURE Remove(job INbinary_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,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代码应立即进行语法分析。9、User_Export()过程返回一个命令,此命令用来安排一个存在的工作以便此工作能重新提交。此程序有两个参数:job与my_call。PROCEDURE User_Export(jobINbinary_ineger,my_callIN OUT varchar2)job参数标识一个安排了的工作。my_call参数包含在它的当前状态重新提交此工作所需要的正文。10、What()过程应许在工作执行时重新设置此正在运行的命令。这个过程接收两个参数:job与what。PROCEDURE What (jobIN binary_ineger,What IN OUT varchar2)job参数标识一个存在的工作。what参数指示将被执行的新的PL/SQL代码。三、查看相关job信息1、相关视图dba_jobsall_jobsuser_jobsdba_jobs_running 包含正在运行job相关信息
www_bitscn_com
2、查看相关信息SQL>SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKENSQL>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 N9127 01-JUN-01 00:00:00 16 Y3 rows selected.正在运行的JOB相关信息SELECT SID, r.JOB, LOG_USER, r.THIS_DATE, r.THIS_SECFROM DBA_JOBS_RUNNING r, DBA_JOBS jWHERE r.JOB = j.JOB;SID JOB LOG_USER THIS_DATE THIS_SEC----- ---------- ------------- --------- --------12 14144 HR 24-OCT-94 17:21:2425 8536 QS 24-OCT-94 16:45:122 rows selected.JOB QUEUE LOCK相关信息SELECT SID, TYPE, ID1, ID2FROM V$LOCKWHERE TYPE = 'JQ';SID TY ID1 ID2--------- -- --------- ---------12 JQ 0 141441 row selected.四、简单例子一个简单例子:中国网管联盟创建测试表SQL> create table TEST(a date);表已创建。创建一个自定义过程SQL> create or replace procedure MYPROC as2begin3insert into TEST values(sysdate);4end;5/过程已创建。创建JOBSQL> variable job1 number;SQL>SQL> begin2dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');--每天1440分钟,即一分钟运行test过程一次3end;4/PL/SQL 过程已成功完成。运行JOBSQL> begin2dbms_job.run(:job1);3end;4/PL/SQL 过程已成功完成。SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from TEST;时间-------------------2001/01/07 23:51:212001/01/07 23:52:222001/01/07 23:53:24删除JOBSQL> begin2dbms_job.remove(:job1);3end;4/ bitsCN_comPL/SQL 过程已成功完成。
例如:每天1点执行的一个job示例:
DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X
,what => 'syn_rpt_members_relation;'
,next_date => to_date('02-07-2008 01:00:00','dd/mm/yyyy hh24:mi:ss')
,interval => 'trunc(sysdate+1)+(1/24)'
,no_parse => FALSE
);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
COMMIT;
END;
/
以上是明确指定每天的1点执行此job,如果指定是每天中午12点执行interval需要指定为 'trunc(sysdate)+1+12/24',如果仅仅指定interval为一天,这样当你手工用dbms_job.run(job)去运行一次时,job每天的执行时间是会改变的,如果你想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)'
1:每分钟执行
Interval => TRUNC(sysdate,'mi') + 1/ (24*60)
或
Interval => sysdate+1/1440
2:每天定时执行
例如:每天的凌晨1点执行
Interval => TRUNC(sysdate) + 1 +1/ (24)
3:每周定时执行
例如:每周一凌晨1点执行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24
4:每月定时执行
例如:每月1日凌晨1点执行
Interval=>TRUNC(LAST_DAY(SYSDATE))+1+1/24
5:每季度定时执行
例如每季度的第一天凌晨1点执行
Interval =>TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
6:每半年定时执行
例如:每年7月1日和1月1日凌晨1点
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
7:每年定时执行
例如:每年1月1日凌晨1点执行
Interval=>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24