oracle的定时任务
oracle数据库定时任务dbms_job的用法详解

oracle数据库定时任务dbms_job的⽤法详解⼀、dbms_job涉及到的知识点1、创建job:variable jobno number;dbms_job.submit(:jobno, —-job号'your_procedure;',—-执⾏的存储过程, ';'不能省略next_date, —-下次执⾏时间'interval' —-每次间隔时间,interval以天为单位);–系统会⾃动分配⼀个任务号jobno。
2、删除job: dbms_job.remove(jobno);3、修改要执⾏的操作: job:dbms_job.what(jobno, what);4、修改下次执⾏时间:dbms_job.next_date(jobno, next_date);5、修改间隔时间:dbms_job.interval(jobno, interval);6、启动job: dbms_job.run(jobno);7、停⽌job: dbms.broken(jobno, broken, nextdate); –broken为boolean值⼆、初始化相关参数job_queue_processes1、job_queue_process表⽰oracle能够并发的job的数量,当job_queue_process值为0时表⽰全部停⽌oracle的job。
2、查看job_queue_processes参数⽅法⼀:show parameter job_queue_process;⽅法⼆:select * from v$parameter where name='job_queue_processes';3、修改job_queue_processes参数alter system set job_queue_processes = 10;三、user_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 正在运⾏任务的开始时间,如果没有运⾏任务则为nullthis_sec varchar2(8) 如hh24:mm:ss格式的this_date⽇期的⼩时,分钟和秒next_date date 下⼀次定时运⾏任务的时间以下使⽤⼀个案例来演⽰dbms_job的使⽤⼀、在plsql中创建表:create table t(id varchar2(30),name varchar2(30));⼆、在plsql中创建存储过程:create or replace procedure proce_t isbegininsert into t(id, name) values('1', to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'));commit;end proce_t;/三、创建job任务(1分钟执⾏⼀次):在sql>后执⾏:variable jobno number;begindbms_job.submit(:jobno,'proce_t;', sysdate, 'sysdate+1/24/60');commit;end;/提交后提⽰:pl/sql procedure successfully completedjobno---------25四、跟踪任务的情况(查看任务队列):sql> select job, next_date, next_sec, failures, broken from user_jobs;job next_date next_sec failures broken---------- ----------- ---------------- ---------- ------25 2012/9/14 1 10:59:46 0 n说明任务已创建成功。
OracleJob学习--两种不同Job使用区别

OracleJob学习--两种不同Job使⽤区别1.两种不同的JobOracle中有两种建⽴Job的⽅式:1)建⽴user_job定时任务declarejob number;BEGINDBMS_JOB.SUBMIT(JOB => job, /*⾃动⽣成JOB_ID*/WHAT => 'proc_add_test;', /*需要执⾏的存储过程名称或SQL语句*/NEXT_DATE => sysdate+3/(24*60), /*初次执⾏时间-下⼀个3分钟*/INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)' /*每隔1分钟执⾏⼀次*/);commit;end;执⾏之后可以通过:select * from user_jobs;2)通过调度器建⽴定时任务 begin sys.dbms_scheduler.create_job(job_name => 'job_name', job_type => 'PLSQL_BLOCK', job_action => 'declare PRM_ERRCODE number; PRM_ERRMSG varchar2(200); begin proc_add_test(PRM_ERRCODE,PRM_ERRMSG); end;', start_date => to_date('01-04-2021 00:00:00', 'dd-mm-yyyy hh24:mi:ss'), repeat_interval => 'Freq=Monthly;Interval=1', end_date => to_date(null), job_class => 'DEFAULT_JOB_CLASS', enabled => true, auto_drop => true, comments => '测试job'); end;2.两种Job定时任务的不同之处1)两种Job都可以调⽤已有的存储过程进⾏定时执⾏。
OracleJob的使用(定时执行)

OracleJob的使⽤(定时执⾏)oracle中的job能为你做的就是在你规定的时间格式⾥执⾏存储过程,定时执⾏⼀个任务。
下⾯是⼀个⼩案例,定时每15分钟向⼀张表插⼊⼀条数据⼀1.创建⼀张测试表-- Create tablecreate table A8(a1 VARCHAR2(500))tablespace DSP_DATApctfree 10initrans 1maxtrans 255storage(initial 64Knext 1Mminextents 1maxextents unlimited);2.创建存储过程实现向测试表插⼊数据create or replace procedure proc_add_test asbegininsert into a8 values (to_char(sysdate, 'yyyy-mm-dd hh:mi'));/*向测试表插⼊数据*/commit;end;3.创建job定时任务实现⾃动调⽤存储过程(当前时间 17:03)declarejob number;BEGINDBMS_JOB.SUBMIT(JOB => job, /*⾃动⽣成JOB_ID*/WHAT =>'proc_add_test;', /*需要执⾏的存储过程名称或SQL语句*/NEXT_DATE => sysdate+3/(24*60), /*初次执⾏时间-下⼀个3分钟*/INTERVAL =>'trunc(sysdate,''mi'')+1/(24*60)'/*每隔1分钟执⾏⼀次*/);commit;end;4.也就是应该从17:06开始每隔1分钟执⾏⼀次存储过程下⾯是截⽌17:12分的测试表的数据⼆1.可以通过查询系统表查看该job信息select*from user_jobs;2.⼿动sql调⽤job (直接调⽤job可以忽略开始时间)beginDBMS_JOB.RUN(40); /*40 job的id*/end;3.删除任务begin/*删除⾃动执⾏的job*/dbms_job.remove(40);end;4.停⽌jobdbms.broken(job,broken,nextdate);dbms_job.broken(v_job,true,next_date); /*停⽌⼀个job,⾥⾯参数true也可是false,next_date(某⼀时刻停⽌)也可是sysdate(⽴刻停⽌)。
【Oracle学习笔记】定时任务(dbms_job)

【Oracle学习笔记】定时任务(dbms_job)⼀、概述Oralce中的任务有2种:Job和Dbms_job,两者的区别有:1. jobs是oracle数据库的对象, dbms_jobs只是jobs对象的⼀个实例,就像对于tables, emp和dept都是表的实例。
2.创建⽅式也有差异,Job是通过调⽤dbms_scheduler.create_job包创建的,Dbms_job则是通过调⽤dbms_job.submit包创建的。
3.两种任务的查询视图都分为dba和普通⽤户的,Job对应的查询视图是dba_scheduler_jobs和user_scheduler_jobs,dbms_jobs对应的查询视图为dba_jobs和user_jobs。
这⾥主要是介绍Dbms_job。
⼆、使⽤1、创建job:1BEGIN2 DBMS_JOB.SUBMIT(3 JOB OUT BINARY_INTERGER,--输出变量,是此任务在任务队列中的编号,也可以⾃定义,⼀般不传4 WHAT IN VARCHAR2,--执⾏的任务的名称及其输⼊参数5 NEXT_DATE IN DATE DEFAULT SYSDATE,--任务执⾏的时间6 INTERVAL IN VARCHAR2DEFAULT NULL,--任务执⾏的时间间隔7 NO_PARSE IN BOOLEAN DEFAULT FALSE,--⽤于指定是否需要解析与作业相关的过程8 INSTANCE IN BINARY_INTEGER DEFAULT ANY_INSTANCE,--⽤于指定哪个例程可以运⾏作业9 FORCE IN BOOLEAN DEFAULT FALSE--⽤于指定是否强制运⾏与作业相关的例程10 );11END新⼿可以使⽤窗⼝创建:2、删除job: dbms_job.remove(jobno); -- jobno任务号3、修改要执⾏的操作: job:dbms_job.what(jobno, what); --指定任务号以及存储过程4、修改下次执⾏时间:dbms_job.next_date(jobno, next_date); --指定任务号的时间5、修改间隔时间:dbms_job.interval(jobno, interval); --指定任务号的间隔时间6、改变与作业相关的所有信息,包括作业操作,作业运⾏⽇期以及运⾏时间间隔等.1 dbms_job.change(2 job in binary_integer,3 what in varchar2,4 next_date in date,5 interval in varchar2,6 instance in binary_integer default null,7 force in boolean default false8 );例⼦:dbms_job.change(2,null,null,'sysdate+2');6、启动job: dbms_job.run(jobno); --指定任务号启动7、停⽌job: dbms.broken(jobno, broken, nextdate); –broken为boolean值 N代表启动,Y代表没启动(STOP)三、Interval 说明间隔/interval是指上⼀次执⾏结束到下⼀次开始执⾏的时间间隔,当interval设置为null时,该job执⾏结束后,就被从队列中删除。
Oracle定时任务(执行某一SQL语句)

Oracle定时任务(执⾏某⼀SQL语句)Oracle定时任务,是定时调⽤存储过程,执⾏存储过程中的SQl语句SQl实例-- 建⽴存储过程CREATE or replace PROCEDURE UPDATE_AGENCYisBEGINUPDATE AGENCY SET AGENCY.STATUS ='Y'WHERE ='@太和县先明商贸'OR ='凤阳县府城润鑫伟业酒业经营部'OR ='永城市东城区锋伟名酒⾏'; -- 需要执⾏的SQl语句end;-- 根据存储过程昵称查看存储任务Select text from user_source where name='UPDATE_AGENCY'order by line;-- 删除存储过程DROP PROCEDURE UPDATE_AGENCY;-- 创建任务declare tm_jobb number; --tm_joba定时任务名称beginsys.dbms_job.submit(tm_jobb, --任务名称'UPDATE_AGENCY;',--执⾏的过程sysdate,--执⾏时间'TRUNC(SYSDATE + 1) + (11*60+55)/(24*60)');--下次执⾏时间 11:55COMMIT;end;-- 查看定时任务SELECT*FROM user_jobs;-- ⼿动启动BEGINdbms_job.run(25);END;-- 停⽌任务BEGINdbms_job.broken(25,true);END;-- 删除任务begindbms_job.remove(25);--ALL_JOBS.job的值end;存job信息的表user_jobs主要字段说明: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)''每3秒钟执⾏⼀次 'sysdate+3/(24*60*60)'每2分钟执⾏⼀次 'sysdate+2/(24*60)'每分钟执⾏Interval => 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秒每天定时执⾏Interval => TRUNC(sysdate+1) --每天凌晨0点执⾏Interval => TRUNC(sysdate+1)+1/24 --每天凌晨1点执⾏Interval => TRUNC(SYSDATE+1)+(8*60+30)/(24*60) --每天早上8点30分执⾏每周定时执⾏Interval => TRUNC(next_day(sysdate,'星期⼀'))+1/24 --每周⼀凌晨1点执⾏Interval => TRUNC(next_day(sysdate,1))+2/24 --每周⼀凌晨2点执⾏每⽉定时执⾏Interval =>TTRUNC(LAST_DAY(SYSDATE)+1) --每⽉1⽇凌晨0点执⾏Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 --每⽉1⽇凌晨1点执⾏每季度定时执⾏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点执⾏每半年定时执⾏Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 --每年7⽉1⽇和1⽉1⽇凌晨1点每年定时执⾏Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24 --每年1⽉1⽇凌晨1点执⾏注意:存储过程中执⾏的SQL语句⼀定要以;结尾。
Oracle存储过程定时任务

DBMS_JOB系统包是Oracle“任务队列”子系统的API编程接口。
DBMS_JOB包对于任务队列提供了下面这些功能:提交并且执行一个任务、改变任务的执行参数以及删除或者临时挂起任务等。
DBMS_JOB包是由ORACLE_HOME目录下的rdbms/admin子目录下的DBMSJOB.SQL和PRVTJOB.PLB 这两个脚本文件创建的。
这两个文件被CATPROC.SQL脚本文件调用,而CATPROC.SQL 这个文件一般是在数据库创建后立即执行的。
脚本为DBMS_JOB包创建了一个公共同义词,并给该包授予了公共的可执行权限,所以所有的Oracle用户均可以使用这个包。
下面几个数据字典视图是关于任务队列信息的,主要有DBA_JOBS, USER_JOBS和DBA_JOBS_RUNNING。
这些字典视图是由名为CATJOBQ.SQL的脚本文件创建的。
该脚本文件和创建DBMS_JOB包的脚本文件一样在ORACLE_HOME目录的rdbms/admin子目录中,同样也是由脚本文件CATPROC.SQL调用。
最后,要使任务队列能正常运行,还必须启动它自己专有的后台过程。
启动后台过程是通过在初始化文件init*.ora(实例不同,初始化文件名也略有不同)中设置初始化参数来进行的。
下面就是该参数:JOB_QUEUE_PROCESSES = n其中,n可以是0到36之间的任何一个数。
除了该参数以外,还有几个关于任务队列的初始化参数,本文后面将会对其进行详细讨论。
DBMS_JOB包中包含有许多过程,见表1所示。
表1 DBMS_JOB包三、DBMS_JOB包参数DBMS_JOB包中所有的过程都有一组相同的公共参数,用于定义任务,任务的运行时间以及任务定时运行的时间间隔。
这些公共任务定义参数见表2所示。
表2 DBMS_JOB过程的公共参数下面我们来详细讨论这些参数的意义及用法。
1、job参数job是一个整数,用来唯一地标示一个任务。
oracle 计划任务

Oracle计划任务博客分类:OracleOracle在10g版本以前,计划任务用的是DBMS_JOB包,10g版本引入DBMS_SCHEDULER来替代先前的DBMS_JOB,在功能方面,它比DBMS_JOB提供了更强大的功能和更灵活的机制管理。
一、 DBMS_JOB1、查看数据库中定时任务的最多并发数,一般设置为102、设置数据库中定时任务的最多并发数,如果设置为0,那么数据库定时作业是不会执行的。
Sql代码3、Job的使用说明:4、创建Job事例1:Job执行间隔时间的Interval参数说明Sql代码5、创建Job事例2:其中最后一个参数'sysdate+1/1440'表示时间间隔为每分钟。
其它常用的时间间隔的设置如下:(1)如果想每天凌晨1点执行,则此参数可设置为'trunc(sysdate)+25/24';(2)如果想每周一凌晨1点执行,则此参数可设置为'trunc(next_day(sysdate,1))+25/24';(3)如果想每月1号凌晨1点执行,则此参数可设置为'trunc(last_day(sysdate))+25/24';(4)如果想每季度执行一次,则此参数可设置为'trunc(add_months(sysdate,3),'Q')+1/24';(5)如果想每半年执行一次,则此参数可设置为'add_months(trunc(sysdate,'yyyy'),6)+1/24';(6)如果想每年执行一次,则此参数可设置为'add_months(trunc(sysdate,'yyyy'),12)+1/24'。
6、Job调度任务查看操作7、Job其它操作(1)启动运行JobSql代码(2)删除job: dbms_job.remove(jobno);(3)修改要执行的操作job: dbms_job.what(jobno,what);(4)修改下次执行时间:dbms_job.next_date(job,next_date);(5)修改间隔时间: dbms_job.interval(job,interval);(6)停止job: dbms.broken(job,broken,nextdate);二、DBMS_SCHEDULER1、 DBMS_SCHEDULER的功能更强大,定义更灵活,增强了与系统的交互性。
oracle定时任务时间写法

在Oracle 数据库中,可以使用DBMS_SCHEDULER 包来创建和管理定时任务。
定时任务的时间写法遵循标准的cron 表达式语。
cron 表达式由个或六个字段组成,分表示分钟、小时日期、月份和星期几。
以下是cron 表达式的常见写法:
1. 每分钟执行次:`* * * * *`
2. 每小时的第30 分钟执行一次:`30 * * * *`
3. 每天的8 点执行一次`0 8 * * *`
4. 每周一的9 点执行一次:`0 9 * * 1`
5. 每的第一天12 点执行一次:`0 12 1 * *`
6. 每年的1 月1 日的00:00 执行一次:`0 0 1 1 *`
其中,`*` 表示匹配任意值,例如`* * * * *` 表示每分钟都执行;数字表示具体的数值例如`30 * * * *` 表示每小时的第30 分钟执行;多个数值可以用逗号分隔,例如`1,15,30 * * * *` 表示每小时的第1、15 和30 分钟执行。
此外,还可以使用特字符来表示一些特定的时间段例如:
- `/` 表示步,例如`*/5 * * * *` 表示每隔5 分钟执行一次。
- `-` 表示范围,例如`0 9-17 * * *` 表示每天9 点到17 点之每小时执行一。
以上是一些常见的定时任务时间写法,你可以根据具体求来编写适合的cro n 表式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个简单的Oracle定时任务2008-07-23 15:41:42 浏览(263)一、在PLSQL中创建表:create or replace table TESTTIME(CARNO VARCHAR2(30),CARINFOID NUMBER);二、在PLSQL中创建存储过程:create or replace procedure pro_testAScarinfo_id number;BEGINselect 'aa' into carinfo_idfrom dual;insert into TESTTIME(TESTTIME.carno,TESTTIME.carinfoid) values(carinfo_id,'123'); commit;end pro_test;三、在SQL命令窗口中启动任务:在SQL>后执行:VARIABLE jobno number;beginDBMS_JOB.SUBMIT(:jobno,'pro_test;',SYSDATE,'sysdate+1/24/12');commit;end;/注意:此处的/一定不能丢。
Dbms_job.submit(job => :jobno, what => ’pro_test;’, next_date => to_date(‘20081025000000’,’yyyymmddhh24miss’));注意符号: jobno前面的冒号, 和pro_test后面的分号提交后提示:PL/SQL procedure successfully completedjobno---------442提示信息四、跟踪任务的情况(查看任务队列):察看已有任务:select job,next_date,next_sec,failures,broken from user_jobs;五、根据任务号删除任务begindbms_job.remove(21);commit;end;oracle定时任务2008-07-23 15:53:29 浏览(1070)引用:/li_guang/archive/2008/06/04/2510846.aspxDBMS_JOB系统包是Oracle“任务队列”子系统的API编程接口。
DBMS_JOB包对于任务队列提供了下面这些功能:提交并且执行一个任务、改变任务的执行参数以及删除或者临时挂起任务等。
DBMS_JOB包是由ORACLE_HOME目录下的rdbms/admin子目录下的DBMSJOB.SQL和PRVTJOB.PLB 这两个脚本文件创建的。
这两个文件被CATPROC.SQL脚本文件调用,而CATPROC.SQL 这个文件一般是在数据库创建后立即执行的。
脚本为DBMS_JOB包创建了一个公共同义词,并给该包授予了公共的可执行权限,所以所有的Oracle用户均可以使用这个包。
下面几个数据字典视图是关于任务队列信息的,主要有DBA_JOBS, USER_JOBS和DBA_JOBS_RUNNING。
这些字典视图是由名为CATJOBQ.SQL的脚本文件创建的。
该脚本文件和创建DBMS_JOB包的脚本文件一样在ORACLE_HOME目录的rdbms/admin子目录中,同样也是由脚本文件CATPROC.SQL调用。
最后,要使任务队列能正常运行,还必须启动它自己专有的后台过程。
启动后台过程是通过在初始化文件init*.ora(实例不同,初始化文件名也略有不同)中设置初始化参数来进行的。
下面就是该参数:JOB_QUEUE_PROCESSES = n其中,n可以是0到36之间的任何一个数。
除了该参数以外,还有几个关于任务队列的初始化参数,本文后面将会对其进行详细讨论。
DBMS_JOB包中包含有许多过程,见表1所示。
表1 DBMS_JOB包三、DBMS_JOB包参数DBMS_JOB包中所有的过程都有一组相同的公共参数,用于定义任务,任务的运行时间以及任务定时运行的时间间隔。
这些公共任务定义参数见表2所示。
表2 DBMS_JOB过程的公共参数下面我们来详细讨论这些参数的意义及用法。
1、job参数job是一个整数,用来唯一地标示一个任务。
该参数既可由用户指定也可由系统自动赋予,这完全取决于提交任务时选用了那一个任务提交过程。
DBMS_JOB.SUBMIT过程通过获得序列SYS.JOBSEQ的下一个值来自动赋予一个任务号。
该任务号是作为一个OUT参数返回的,所以调用者随后可以识别出提交的任务。
而DBMS_JOB.ISUBMIT过程则由调用者给任务指定一个识别号,这时候,任务号的唯一性就完全取决于调用者了。
除了删除或者重新提交任务,一般来说任务号是不能改变的。
即使当数据库被导出或者被导入这样极端的情况,任务号也将被保留下来。
所以在执行含有任务的数据的导入/导出操作时很可能会发生任务号冲突的现象。
2、whatwhat参数是一个可以转化为合法PL/SQL调用的字符串,该调用将被任务队列自动执行。
在what参数中,如果使用文字字符串,则该字符串必须用单引号括起来。
what参数也可以使用包含我们所需要字符串值的VARCHAR2变量。
实际的PL/SQL调用必须用分号隔开。
在PL/SQL调用中如果要嵌入文字字符串,则必须使用两个单引号。
what参数的长度在Oracle7.3中限制在2000个字节以内,在Oracle 8.0以后,扩大到了4000个字节,这对于一般的应用已完全足够。
该参数的值一般情况下都是对一个PL/SQL存储过程的调用。
在实际应用中,尽管可以使用大匿名Pl/SQL块,但建议大家最好不要这样使用。
还有一个实际经验就是最好将存储过程调用封装在一个匿名块中,这样可以避免一些比较莫名错误的产生。
我来举一个例子,一般情况下,what参数可以这样引用:但是比较安全的引用,应该这样写:任何时候,我们只要通过更改what参数就可以达到更改任务定义的目的。
但是有一点需要注意,通过改变what参数来改变任务定义时,用户当前的会话设置也被记录下来并成为任务运行环境的一部分。
如果当前会话设置和最初提交任务时的会话设置不同,就有可能改变任务的运行行为。
意识到这个潜在的副作用是非常重要的,无论何时只要应用到任何DBMS_JOB过程中的what参数时就一定要确保会话设置的正确。
3、next_dateNext_date参数是用来调度任务队列中该任务下一次运行的时间。
这个参数对于DBMS_JOB.SUBMIT和DBMS_JOB.BROKEN这两个过程确省为系统当前时间,也就是说任务将立即运行。
当将一个任务的next_date参数赋值为null时,则该任务下一次运行的时间将被指定为4000年1月1日,也就是说该任务将永远不再运行。
在大多数情况下,这可能是我们不愿意看到的情形。
但是,换一个角度来考虑,如果想在任务队列中保留该任务而又不想让其运行,将next_date设置为null却是一个非常简单的办法。
Next_date也可以设置为过去的一个时间。
这里要注意,系统任务的执行顺序是根据它们下一次的执行时间来确定的,于是将next_date参数设置回去就可以达到将该任务排在任务队列前面的目的。
这在任务队列进程不能跟上将要执行的任务并且一个特定的任务需要尽快执行时是非常有用的。
4、IntervalInternal参数是一个表示Oracle合法日期表达式的字符串。
这个日期字符串的值在每次任务被执行时算出,算出的日期表达式有两种可能,要么是未来的一个时间要么就是null。
这里要强调一点:很多开发者都没有意识到next_date是在一个任务开始时算出的,而不是在任务成功完成时算出的。
当任务成功完成时,系统通过更新任务队列目录表将前面算出的next_date值置为下一次任务要运行的时间。
当由interval表达式算出next_date是null时,任务自动从任务队列中移出,不会再继续执行。
因此,如果传递一个null值给interval参数,则该任务仅仅执行一次。
通过给interval参数赋各种不同的值,可以设计出复杂运行时间计划的任务。
本文后面的“任务间隔和日期算法”将对interval表达式进行详细讨论,并给出一个实际有用interval表达式的例子。
四、任务队列架构和运行环境任务队列在Oracle系统中其实是一个子系统,它具有自己特定的后台过程和目录表。
该子系统设计的目的是为了能不在用户干预下自动运行PL/SQL过程。
1、任务队列后台过程任务队列(SNP)后台过程随着Oracle实例的启动而同时启动。
在文章前面已经谈到初始化文件init.ora 中的参数JOB_QUEUE_PROCESSES,用来设置有几个队列过程。
这里设置了几个过程,系统中就会有几个SNP过程被启动。
JOB_QUEUE_PROCESSES这个参数,可以是0到36中的任何一个数,也就是说对于每个Oracle实例最多可以有36个SNP过程,也可以不支持队列过程(=0)。
在大多数操作系统中,SNP三个字母常作为过程名的一部分出现。
如,在unix系统中,如果该Oracle实例名为ora8,有三个任务队列过程,则这三个任务队列过程名称为:SNP后台过程和其他的Oracle后台过程的一个重要区别就是杀掉一个SNP过程不会影响到Oracle实例。
当一个任务队列过程失控或者消耗太多的资源时,就可以将其杀掉,当然这种情况不是经常遇到的。
当一个SNP过程被杀掉或者失败时,Oracle就自动启动一个新的SNP过程来代替它。
2、有关任务队列的初始化参数初始化文件init.ora中的几个参数控制着任务队列后台的运行,下面我们将对其进行详细讨论。
(1)、JOB_QUEUE_INTERVAL任务队列过程定期唤醒并检查任务队列目录表是否有任务需要执行。
参数JOB_QUEUE_INTERVAL决定SNP过程两次检查目录表之间“休眠”多长时间(单位为秒)。
间隔设的太小会造成由于SNP过程不断检查目录表而导致不必要的系统吞吐量。
相反如果间隔设得太大,SNP过程在特定的时间没有被唤醒,那个时间的任务就不会能被运行。
最佳的时间间隔设置要综合考虑系统环境中不同的任务,60秒的确省设置可以满足大多数的应用。
(2)、JOB_QUEUE_KEEP_CONNECTIONS除了前面介绍的JOB_QUEUE_PROCESS和JOB_QUEUE_INTERVAL两个参数以外,影响SNP后台过程行为的第三个参数是JOB_QUEUE_KEEP_CONNECTIONS。
当该参数为TRUE时,SNP过程在两个任务的运行期间(也就是休眠期间),仍然和Oracle保持开放的连接。