如何激活日期的触发器

时间:2011-07-27 19:06:18

标签: oracle plsql triggers oracle10g dbms-scheduler

如果系统达到特定日期,我怎么能有一个更新某个字段的触发器?

即。

+---------------------+  +-------------+
|   Trains            |  |    Trips    |
+---------------------+  +-------------+
| id                  |  |  id         |
| distanceTraveled    |  |  endDate    |
|                     |  |  trainUsed  |
|                     |  |  distance   |
+---------------------+  +-------------+

火车:

  • train1,0
  • train2,0
  • train3,0
  • train4,0

旅行:

  • 1,明天12:00:00,train1,10
  • 明天2,14:45:00,火车3,20
  • 3,02:15:00-tomorow,train1,15

执行:

  • 明天中午12点00分,更新表格列车,以便train1的distanceTraveled字段达到10
  • 明天14:45:00,更新火车列车,以便train3的distanceTraveled字段到达20
  • 在明天后的02:15:00,更新表格列车,以便train1的distanceTraveled字段到达25

2天内的最终结果将是

火车:

  • train1,25
  • train2,0
  • train3,20
  • train4,0

2 个答案:

答案 0 :(得分:7)

您应该查看DBMS_SCHEDULER包:

  

DBMS_SCHEDULER包提供了一组可从任何PL / SQL程序调用的调度函数和过程。

它有点像内置的cron(具有更多功能)。

答案 1 :(得分:3)

为了充实@ Mat的答案,我认为你想要的是这样的:

create or replace procedure update_train_distance(p_train_id trains.id%type,
                                                  p_distance trips.distance%type) is
begin
   update trains 
      set distancetraveled = nvl(distancetraveled,0)+p_distance
      where id = p_train_id;
end update_train_distance;

begin
dbms_scheduler.create_program('sched_train_update',
                              'STORED_PROCEDURE',
                              'UPDATE_TRAIN_DISTANCE',
                              2,
                              TRUE);
dbms_scheduler.define_program_argument('sched_train_update',
                                       1,
                                       'p_train_id',
                                       'VARCHAR2',
                                       '0');
dbms_scheduler.define_program_argument('sched_train_update',
                                       2,
                                       'p_distance',
                                       'NUMBER',
                                       0);
end;

create or replace trigger trips_sched_ai
after insert on trips
for each row
begin
   dbms_scheduler.create_job(job_name => 'TRIP_' || :new.id,
                             program_name => 'sched_train_update',
                             start_date => :new.enddate,
                             auto_drop => true);
   dbms_scheduler.set_job_argument_value(job_name => 'TRIP_' || :new.id,
                                         argument_name => 'p_train_id',
                                         argument_value => :new.trainid);
   dbms_scheduler.set_job_argument_value(job_name => 'TRIP_' || :new.id,
                                         argument_name => 'p_distance',
                                         argument_value => :new.distance);
   dbms_scheduler.enable('TRIP_' || :new.id);
end trg_trips_sched;

你应该记住,这是一个未经考验的例子,可能有一些我错过的东西。至少,您可能需要添加触发器以在执行作业之前处理更新或删除。