2011-07-27 74 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

相關問題