Как активировать триггер на свидание - PullRequest
2 голосов
/ 27 июля 2011

Как у меня может быть триггер, который обновляет определенное поле, когда система достигает определенной даты?

т.е.

+---------------------+  +-------------+
|   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 завтра, поезд 3, 20
  • 3, 02:15:00 после завтра, поезд1, 15

Исполнение:

  • Завтра в 12:00:00 обновите таблицу train, чтобы поле distanceTraveled для train1 было равно 10
  • Завтра в 14:45:00 обновите таблицу train, чтобы поле distanceTraveled для train3 было равно 20
  • В 02:15:00 послезавтра обновите таблицу train, чтобы поле distanceTraveled для train1 было равно 25

Окончательный результат через 2 дня будет

Поезда:

  • поезд1, 25
  • поезд2, 0
  • поезд3, 20
  • поезд4, 0

Ответы [ 2 ]

7 голосов
/ 27 июля 2011

Вам следует взглянуть на пакет DBMS_SCHEDULER:

Пакет DBMS_SCHEDULER предоставляет набор функций и процедур планирования, которые можно вызывать из любой программы PL / SQL..

Это что-то вроде встроенного cron (с гораздо большим количеством функций).

3 голосов
/ 28 июля 2011

Чтобы конкретизировать ответ @ Мата, я думаю, что вы хотите что-то вроде этого:

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;

Вы должны иметь в виду, что это непроверенный пример и что могут быть вещи, которые я пропустил,Как минимум, вам, вероятно, нужно добавить триггеры для обработки обновления или удаления до выполнения задания.

...