То, что я пытаюсь сделать, - уменьшить стоимость каждого транспортного средства в таблице «Транспорт», чтобы, когда дата достигает одного месяца после значения «LastUpdate», столбец «Значение» снижается на 2,5%. Триггер должен запускаться ПОСЛЕ ЛОГОТИПА НА БАЗЕ ДАННЫХ. Проблема заключается в том, что администратор баз данных не может каждый день входить в базу данных, поэтому, если прошло шесть месяцев с момента последнего входа в систему, триггер начнет циклический переход, уменьшит значение на 2,5% и сделает ADD_MONTHS (LastUpdate, 1).Уменьшите стоимость автомобиля каждый месяц
Мой код для функции, которая будет вычислять значение является:
REATE OR REPLACE FUNCTION fn_Vehicle_Value
(VehicleNumber IN NUMBER,
VehicleValue IN OUT NUMBER)
RETURN NUMERIC
IS
BEGIN
VehicleValue := VehicleValue - (VehicleValue * 0.025);
RETURN VehicleValue;
END;
/
Это моя попытка создания системы запуска:
CREATE OR REPLACE TRIGGER tg_VehicleDepreciate
AFTER LOGON ON DATABASE
IS
CURSOR vehicle_cur IS SELECT "VALUE", LastUpdate FROM Vehicle;
BEGIN
FOR vehicle_rec IN vehicle_cur LOOP
WHILE LastUpdate < SYSDATE LOOP
LastUpdate."Value" := fn_Vehicle_Update("VALUE");
UPDATE Vehicle
SET LastUpdate := ADD_MONTHS(LastUpdate, 1)
WHERE Vehicle# = vehicle_cur.Vehicle#;
END LOOP;
EXIT WHEN vehicle_cur%NOTFOUND;
END LOOP
END;
/
Из того, что я могу сказать, моя функция является правильным , Но триггер не собирает и выдает следующее сообщение об ошибке:
Отчете об ошибке - ORA-04079: неверная спецификация триггера 04079. 00000 - "неверная спецификация триггера" * Причина: создать заявление TRIGGER недействительно , * Действие: Проверьте правильность синтаксиса.
Я предполагаю, что это синтаксическая ошибка, но также может быть логическая ошибка, которую я не могу решить.
Почему бы просто не создать представление, которое вычисляет это «на лету»? Я не вижу необходимости создавать триггер для чего-то, что может быть получено из существующих данных (вам понадобится «дата начала» или «дата создания» в таблице «автомобиль») –
Его назначение uni, и я должен сделайте то, что мне сказали. Учитель сказал нам, что нам нужно использовать функцию и триггер. – Tom
Звучит немного глупо, чтобы инициировать ваше обновление с помощью триггера 'AFTER LOGON ON DATABASE'. Почему вы не создаете 'SCHEDULER JOB' и запускаете это один раз в полночь, например? –