2011-07-27 53 views
2

如何在系统达到特定日期时触发某个字段?如何激活日期的触发器

+---------------------+ +-------------+ 
| 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分零零秒明天,train3,20
  • 3,2点十五分00秒后tomorow, TRAIN1,15

执行:

  • 在明天12:00: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

回答

3

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

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; 

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

7

你应该看看DBMS_SCHEDULER包:

的DBMS_SCHEDULER包提供的调度功能和程序的集合,可以在PL调用/ SQL程序。

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

+0

谢谢,不完全是我需要的,但它帮助我确定如何去做。 – flatzo

+0

如果这不完全符合您的需求,请删除接受并编辑您的问题,以提供有关您想要的更多详细信息。有了一个被接受的答案,更少的人会看你的问题,所以你可能会错过一些好的建议。 (编辑你的问题会使它“活跃”,并在首页跳回一点。) – Mat

+0

感谢提示 – flatzo

相关问题