分类:
2008-10-16 19:10:14
10g 数据库第 1 版中引入的 Scheduler 是下一代作业调度系统,它取代了 DBMS_JOB 附带的程序包。与该程序包相比,此 Scheduler 工具有一些显著的优点(详见此处最初的介绍)。
在 Oracle Scheduler 的第一版中,作业基于时间并根据时间触发。但如果要使触发器基于事件该怎么办?例如,当帐户的 Account Manager 更改时,您可能希望一个批处理程序自动执行以重新计算收入并重新发布报表。
可以在 Oracle 数据库 10g 第 2 版的 Scheduler 工具中实现此类基于事件的触发。事件通过 Advanced Queueing (AQ)(其中有效载荷是一个对象类型)传递给 Scheduler。因此,您首先需要创建一个 AQ(如 proc_queue),在这里将把任意这样的事件排队。然后,您必须基于此事件创建一个调度。
begin dbms_scheduler.create_event_schedule ( schedule_name => 'accadmin.acc_mgr_change', start_date => systimestamp, event_condition => 'tab.user_data.event_name = ''acc_mgr_change''', queue_spec => 'proc_queue'); end; |
接着,您将创建一个作业以遵循此调度。您也可以直接调度一个作业而不用先创建一个调度。
begin dbms_scheduler.create_job ( job_name => acc_mgr_change, program_name => acc_mgr_change_procs, start_date => 'systimestamp, event_condition => 'tab.user_data.event_name = ''acc_mgr_change''', queue_spec => 'proc_queue' enabled => true); end; |
默认值是 UNLIMITED。
如果事件(而不是特定时间)是触发作业的决定因素,则基于事件的调度很有帮助。