Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92494240
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-15 13:34:53

    来源:赛迪网技术社区    作者:yuanyaung

创建你的第一个任务

要创建一个重复性任务,你首先需要定义程序和调度表。假定你需要在每隔一天的下午6:00加载一个外部表。首先创建一个调度程序,它提供一个 PL/SQL 块以执行该加载。代码清单1中的PL/SQL 块发出一个对DBMS_SCHEDULER.CREATE_PROGRAM的调用,作为程序操作所提供的 PL/SQL 块包含有一个简单的INSERT...SELECT FROM 语句,用于从该外部表中载入新的客户。

接着,创建一个调度表,根据该调度表运行该程序。代码清单2 给出一个对DBMS_SCHEDULER.CREATE_SCHEDULE的调用,用于创建我的 PERIODICLOADS调度表。注释和调度表名称参数相当简单。注释可以是提醒你为什么要创建该调度表的任意文本。schedule_ name 参数指明该调度表的所有者和名称。与程序和任务相类似,调度程序也是模式对象,它们的名称必须符合与表、索引等相同的命名规则。

start_date为一个TIMESTAMP WITH TIME ZONE 值,它指明该调度表什么时候被激活。此调度表在(美国东部时间)2004年3月22日星期一开始时被激活。

此调度程序引入了一个功能强大的日历语法,你可以用此语法调度重复性任务。此语法具有三个组件: 频度、间隔和时刻。你还有一个选项:基于一个PL/SQL表达式定义重复间隔(如果你对一个任务定义了一个内嵌调度程序),但是我相信你可能找到一种日历语法,它能满足除最不常用的调度表以外的所有调度表的需要。以下语句是我的PERIODICLOADS 调度表中repeat_interval参数中的日历语法:

  
  FREQ=DAILY;INTERVAL=2;BYHOUR=18;
  BYMINUTE=0;BYSECOND=0
  

FREQ=DAILY 根据PERIODICLOADS 调度表规定,任何任务相继运行之间的重复时间间隔以天或者24小时为单位计算。INTERVAL=2 指明单位的数目,在此例中为2天。三个 BY 数值-BYHOUR=18, BYMINUTE=0, and BYSECOND=0-指明任务运行的时刻,以24小时制表示。代码清单2中的PERIODICLOADS 调度表将给出以下任务运行时间:

第一次运行是在2004年3月22日星期一,下午6:00。

第二次运行是在2004年3月22日星期一的两天之后,即3月24日星期三的下午6:00。

第三次运行是在2004年3月22日星期一的两天之后再过两天,即3月26日星期五下午6:00。

该日历语法的一个非常好的特色就是它消除了使用DBMS_JOB时可能会发生的调度表时间偏移。一个任务实例的起始时间不会影响下一个任务实例的起始时间。相反,调度表的重复时间间隔总是根据调度表的start_date重新进行计算。

该日历算法的通用性很好。 你不仅可以为每个 BY 关键字指定一个单一取值,而且还可以指定一个取值列表。例如,如果你希望总在星期一、星期三和星期五进行周期性加载,那么你可以指定重复时间间隔如下:

  
  FREQ=WEEKLY;INTERVAL=1;
  BYDAY=MON,WED,FRI;BYHOUR=18;BYMINUTE=0;
  BYSECOND=0
  

此调度表将每周重复一次 (INTERVAL=1);它将在每周的星期一、星期三和星期五启动任务 (BYDAY=MON,WED,FRI);并且这些任务将在这些天的每个下午6:00 p.m (BYHOUR=18; BYMINUTE=0;BYSECOND=0) 运行。

在你已经定义了程序和调度表之后,下一个步骤就是将这两个对象以一个任务的形式连接在一起。代码清单3显示一个对DBMS_SCHEDULER.CREATE_JOB的调用,它创建一个名为 LOADNEWCUSTOMERS的任务。此任务将根据PERIODICLOADS调度表运行LOADCUSTOMERS程序。

将调度表、程序和任务分离可以实际减少你的工作量。你可以在任何时间基于PERIODICLOADS调度表创建一个新的任务,而且此新任务将在与刚创建的LOADNEWCUSTOMERS任务相同的时刻和以相同的时间间隔运行。

代码清单2 中定义的调度表给出以下任务开始运行的时间:

2004年3月22日星期一,下午6:00。

2004年3月24日星期三,下午6:00。

2004年3月26日星期五,下午6:00。

当你将一个任务连接到此调度表时,该任务将在你将两者连接在一起的日期和时间之后的下一个调度时间运行。例如,如果你在2004年3月23日星期二创建一个如代码清单3 所示的任务,此任务将在3月24日星期三的下午6:00第一次运行。如果你拥有按照同一调度表运行的几个相关任务,并且你需要修改该调度表,那么对整个相关任务集只需修改一次。

阅读(535) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~