Как активировать триггер на свидание
Как я могу иметь триггер, который обновляет определенное поле, когда система достигает определенной даты?
т.е.
+---------------------+ +-------------+
| 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 ответа
Решение
Чтобы конкретизировать ответ @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;
Вы должны иметь в виду, что это непроверенный пример и что могут быть вещи, которые я пропустил. Как минимум, вам, вероятно, нужно добавить триггеры для обработки обновления или удаления перед выполнением задания.
Вы должны взглянуть на DBMS_SCHEDULER
пакет:
Пакет DBMS_SCHEDULER предоставляет набор функций и процедур планирования, которые можно вызывать из любой программы PL/SQL.
Это вроде как встроенный cron
(с гораздо большим количеством функций).