2

当系统到达某个日期时,我怎么会有一个更新某个字段的触发器?

IE

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

火车:

  • 火车1, 0
  • 火车2, 0
  • 火车3, 0
  • 火车4, 0

行程:

  • 1 明天 12:00:00 火车 1, 10
  • 2、明天14:45:00,train3,20
  • 3, 02:15:00 明后 , train1, 15

执行 :

  • 明天 12:00:00,更新表 train,以便 train1 的 distanceTraveled 字段变为 10
  • 明天 14:45:00,更新表 train,以便 train3 的 distanceTraveled 字段变为 20
  • 在后天 02:15:00,更新表 train,以便 train1 的 distanceTraveled 字段变为 25

2天后的最终结果将是

火车:

  • 火车1, 25
  • 火车2, 0
  • 火车3, 20
  • 火车4, 0
4

2 回答 2

7

你应该看看这个 DBMS_SCHEDULER包:

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

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

于 2011-07-27T19:10:35.867 回答
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;

您应该记住,这是一个未经测试的示例,并且可能有一些我遗漏的东西。至少,您可能需要在作业执行之前添加触发器来处理更新或删除。

于 2011-07-27T20:45:07.567 回答