三思笔记系列文章之
全面学习ORACLE数据库SCHEDULER特性
2009-08
一、使用Jobs (2)
1.1创建Jobs (2)
1.2管理Jobs (4)
二、使用Programs (6)
2.1创建Programs (7)
2.2管理Programs (8)
三、使用Schedules (9)
3.1创建和管理Schedules (10)
3.2Schedules调度Programs执行的Jobs (11)
3.3设置Repeat Interval (12)
四、使用Events (16)
4.1Scheduler抛出的Events (16)
4.2Application抛出的Events (18)
五、使用Chains (21)
5.1创建Chains (22)
5.2管理Chains (26)
六、使用Job Classes (28)
七、使用Windows (30)
附:三思笔记系列文章快速链接: (33)
所谓出于job而胜于job,说的就是Oracle10g后的新特性Scheduler啦。在10g环境中,ORACLE建议使用Scheduler替换普通的job,来管理任务的执行。其实,将Scheduler描述成管理job的工具已经太过片面了,10G 版本中新增的Scheduler绝不仅仅是创建任务这么简单。。。。
提示:ORACLE中管理Scheduler是通过DBMS_SCHEDULER包,本章也以此为切入点,通过详细介绍DBMS_SCHEDULER包的使用,来演示如何使用Scheduler。似乎本末倒置了,没关系,"三思笔记",俺的地盘俺做主。
一、使用Jobs
所谓JOBS,其实就是Scheduler管理的一个(或多个)任务的执行调度。
1.1创建Jobs
通过DBMS_SCHEDULER包来创建Jobs,是使用其CREATE_JOB过程。在创建Job时,用户可以指定要执行的任务,调度信息(啥时候执行,执行周期,终止日期等)以及其它一些任务相关的属性。CREATE_JOB过程调用还是比较简单的,例如:
JSSWEB>BEGIN
2DBMS_SCHEDULER.CREATE_JOB(
3job_name=>'INSERT_TEST_TBL',
4job_type=>'STORED_PROCEDURE',
5job_action=>'P_INSERTINTOTEST',
6start_date=>sysdate,
7repeat_interval=>'FREQ=DAILY;INTERV AL=1');
oracle数据库表结构怎么看8END;
9/
PL/SQL过程已成功完成。
事实上,有权限的话,用户也可以创建其它SCHEMA下的JOB,只需要在指定JOB_NAME时,按照schema.job_name的格式即可。注意哟,这种情况下创建的JOB,其CREATED与OWNER有可能并不相同的哟。
当使用CREATE_JOB过程创建JOB时,可指定的参数值很多,只不过多数情况下用户仅指定部分参数即
可满足需求。
其中,上例中指定的参数,分别代表的含义如下:
�JOB_NAME:指定任务的名称,必选值,注意要确保指定的名称唯一。
�JOB_TYPE:任务执行的操作类型,必选值,有下列几个可选值:
�PLSQL_BLOCK:表示任务执行的是一个PL/SQL匿名块。
�STORED_PROCEDURE:表示任务执行的是ORACLE过程(含PL/SQL PROCEDURE和JAVA PROCEDURE),本例中正是指定这一参数值。
�EXECUTABLE:表示任务执行的是一个外部程序,比如说操作系统命令。
�CHAIN:表示任务执行的是一个CHAIN。
�JOB_ACTION:任务执行的操作,必选值,应与JOB_TYPE类型中指定的参数相匹配。
比如说对于PL/SQL匿名块,此处就可以放置PL/SQL块的具体代表,类似DECLARE..BEGIN..END 这类;如果是ORACLE过程,那么此处应该指定具体的过程名,注意由于任务执行,即使过程中有OUT
之类参数,实际执行时也不会有输出的。
�START_DATE:指定任务初次执行的时间,本参数可为空,当为空时,表示任务立刻执行,效果等同于指定该参数值为SYSDATE。
�REPEAT_INTERV AL:指定任务执行的频率,比如多长时间会被触发再次执行。本参数也可以为空,如果为空的话,就表示当前设定的任务只执行一次。REPEAT_INTERV AL参数需要好好说说,因为这一参数与标准JOB中的INTERVAL参数有很大区别,相比之下,REPEAT_INTERV AL参数的语法结构要复杂的多。其中最重要的是FREQ和INTERV AL两个关键字。
�FREQ关键字用来指定间隔的时间周期,可选参数有:YEARLY,MONTHLY,WEEKLY,DAILY, HOURLY,MINUTELY,and SECONDLY,分别表示年、月、周、日、时、分、秒等单位。
�INTERVAL关键字用来指定间隔的频繁,可指定的值的范围从1-99。
例如:REPEAT_INTERV AL=>'FREQ=DAILY;INTERV AL=1';表示每天执行一次,如果将INTERVAL改为7就表示每7天执行一次,效果等同于FREQ=WEEKLY;INTERV AL=1。
一般来说,使用DBMS_SCHEDULER.CREATE_JOB创建一个JOB,至少需要指定上述参数中的前3项。除此之外,还可以在CREATE_JOB时,指定下列参数:
�NUMBER_OF_ARGUMENTS:指定该JOB执行时需要附带的参数的数量,默认值为0,注意当JOB_TYPE列值为PLSQL_BLOCK或CHAIN时,本参数必须设置为0,因为上述两种情况下不支持附带参数。
�END_DATE:指定任务的过期时间,默认值为NULL。任务过期后,任务的STATE将自动被修改为COMPLETED,ENABLED被置为FALSE。如果该参数设置为空的话,表示该任务永不过期,将一直按照REPEAT_INTERV AL参数设置的周期重复执行,直到达到设置的MAX_RUNS或MAX_FAILURES值。
�JOB_CLASS:指定任务关联的CLASS,默认值为DEFAULT_JOB_CLASS。关于JOB CLASS的信息就关注本系列的后续文章。
�ENABLED:指定任务是否启用,默认值为FALSE。FALSE状态表示该任务并不会被执行,除非被用户手动调用,或者用户将该任务的状态修改为TRUE。
�AUTO_DROP:当该标志被置为TRUE时,ORACLE会在满足条件时自动删除创建的任务�任务已过期;
�任务最大运行次数已达MAX_RUNS的设置值;
�任务未指定REPEAT_INTERV AL参数,仅运行一次;
该参数的默认值即为TRUE。用户在执行CREATE_JOB过程时可以手动将该标志指定为FALSE,当参数值设置为FALSE时,即使满足上述提到的条件任务也不会被自动删除,这种情况下,唯一能够导致任务被删除的情况,就是用户主动调用DROP_JOB过程。
�COMMENTS:设置任务的注释信息,默认值为NULL。
上面的例子创建了一个新的JOB,不过这个JOB与普通JOB不同哟,此时查询USER_JOBS视图是查不到刚刚创建的JOB的信息,因为这个JOB是SCHEDULER管理的JOB。要查询SCHEDULER管理的JOS,应该通过USER_SCHEDULER_JOBS(当然ALL_SCHEDULER_JOBS和DBA_SCHEDULER_JOBS也可以),例如:JSSWEB>select job_name,job_type,job_action,to_char(start_date,'yyyy-mm-dd hh24:mi:ss'),repeat_interval,enabled,state from user_scheduler_jobs;
JOB_NAME JOB_TYPE JOB_ACTION TO_CHAR(START_DATE, REPEAT_INTERV AL ENABL STATE
----------------------------------------------------------------------------------------------------------------------------------INS
ERT_TEST_TBL STORED_PROCEDURE P_INSERTINTOTEST2009-07-2713:46:50 FREQ=DAILY;INTERV AL=1FALSE DISABLED
不过,细心的盆友可能会发现,JOB虽然成功创建了,但却并未执行,这是怎么回事?其实原因很简单,还记的前面介绍CREATE_JOB过程时提到的ENABLED参数吗,当不显式指定时,该参数的默认值为false,JOB 自然不会运行了。如果遇到这类情形,如何修改呢?请继续关注下一节。
1.2管理Jobs
1.2.1启用Jobs
前面创建JOB时,由于未显式的指定ENABLED参数,因此即使指定了START_DATE,不过默认情况下JOB 不会自动执行。对于这种情况,DBMS_SCHEDULER包中提供了一个过程ENABLE,可以用来修改JOB的启用状态,调用方式非常简单,例如:
JSSWEB>exec able('INSERT_TEST_TBL');
PL/SQL procedure successfully completed.
1.2.2禁用Jobs
DBMS_SCHEDULER.ENABLE仅用来将JOB(其实不仅仅对JOB有效,对于CHAIN、PROGRAM等也有效)的启用状态置为TRUE。如果想将其启用状态置为FALSE?简单,还有一个与该功能对应的过程:DBMS_SCHEDULER.DISABLE,例如:
JSSWEB>exec dbms_scheduler.disable('INSERT_TEST_TBL');
PL/SQL procedure successfully completed.
这两个过程仅用来重置对象的状态,因此均可以无限次执行,即使执行时对象已经被置为要指定的状态。
1.2.3修改Jobs
由于JOB的属性众多,难免时不时的可能会遇到需要修改的情况,比如说前面创建JOB时不小心,指定要执行的过程名输入错误(完全有可能,CREATE_JOB在创建时不会自动检查指定的过程是否有效,从这方面考虑,SCHEDULER不如普通JOB严谨哪),这种情况下就必然涉及到对JOB的修改(或者说重定义),没问题,DBMS_SCHEDULER包中专门提供了一个过程SET_A TTRIBUTE,可以用来修改任务的属性值。
例如,修改刚刚创建的JOB:INSERT_TEST_TBL执行的过程,执行语句如下:
JSSWEB>exec dbms_scheduler.set_attribute('INSERT_TEST_TBL','JOB_ACTION','P_INSERTINTOTEST');
PL/SQL procedure successfully completed
当然啦,我们这里执行的这条语句,执行跟没执行没有区别,此处仅做示例,大家表深究。
SET_A TTRIBUTE过程虽然仅有三个参数,不过能够修改的属性值可是不少,以下列举几个较常用到的:�LOGGING_LEVEL:指定对jobs执行情况记录的日志信息级别。
SCHEDULER管理的JOB对任务的执行情况专门进行了记录,同时用户还可以选择日志中记录信息的
级别,有下列三种选择:
�DBMS_SCHEDULER.LOGGING_OFF:关闭日志记录功能;
�DBMS_SCHEDULER.LOGGING_RUNS:对任务的运行信息进行记录;
�DBMS_SCHEDULER.LOGGING_FULL:记录任务所有相关信息,不仅有任务的运行情况,甚至连任务的创建、修改等也均将记入日志。
提示:查看SCHEDULER管理的JOB,可以通过USER_SCHEDULER_JOB_LOG和USER_SCHEDULER_JOB_RUN_DETAILS两个视图中查询
�RESTARTABLE:指定jobs运行出错后,是否能够适时重启
创建任务时如未明确指定,本参数默认情况下设置为FALSE,如果设置为TRUE,就表示当任务运行时出错,下次运行时间点到达时仍会启动,并且如果运行仍然出错,会继续重新运行,不过如果连接出错达到6次,该job就会停止。
�MAX_FAILURES:指定jobs最大连续出错次数
该参数值可指定的范围从1-1000000,默认情况下该参数设置为NULL,表示无限制。达到指定出错次数后,该job会被自动disable。
�MAX_RUNS:指定jobs最大运行次数
该参数值可指定的范围从1-1000000,默认情况下该参数设置为NULL,表示无限制(只是运行次数无限制,实际job会否继续运行,仍受制于end_date以及max_failures等参数的设置)。达到指定运行次数后,该job也将被自动disable,并且状态会被置为COMPLETED。
�JOB_TYPE:指定job执行的任务的类型
有四个可选值:'PLSQL_BLOCK','STORED_PROCEDURE','EXECUTABLE',and'CHAIN'。
�JOB_ACTION:指定job执行的任务
这一参数所指定的值依赖于JOB_TYPE参数中的值,比如说JOB_TYPE设置为'STORED_PROCEDURE',那么本参数值中指定的一定是ORACLE中的过程名。
�START_DATE:指定job初次启动的时间
�END_DATE:指定job停止运行的时间
本参数又与AUTO_DROP相关联,如果AUTO_DROP设置为TRUE的话,那么一旦job到达停止运行的时间,该job就会被自动删除,否则的话job任何存在,不过状态被修改为COMPLETED。
除此之外,其它还包括MAX_RUN_DURATION,JOB_WEIGHT,INSTANCE_STICKINESS,STOP_ON_WINDOW_CLOSE,JOB_PRIORITY,SCHEDULE_LIMIT,PROGRAM_NAME,NUMBER_OF_ARGUMENTS,SCHEDULE_NAME,REPEAT_INTERVAL,JOB_CLASS,COMMENTS,AUTO_DROP,EVENT_SPEC,RAISE_EVENTS等等,这些参数所代表的意义此处不一一详述,感兴趣的朋友可以查阅相关官方文档,或者等待本系列文章的外传,黑黑。
仅从这些可设置属性就可以看出,Scheduler管理的job确实非常灵活,上述提到了这些参数,均可以使用DBMS_SCHEDULER.SET_A TTRIBUTE过程进行设置。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论