2014-10-11 3 views
-2

То, что я пытаюсь сделать, - уменьшить стоимость каждого транспортного средства в таблице «Транспорт», чтобы, когда дата достигает одного месяца после значения «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 недействительно , * Действие: Проверьте правильность синтаксиса.

Я предполагаю, что это синтаксическая ошибка, но также может быть логическая ошибка, которую я не могу решить.

+3

Почему бы просто не создать представление, которое вычисляет это «на лету»? Я не вижу необходимости создавать триггер для чего-то, что может быть получено из существующих данных (вам понадобится «дата начала» или «дата создания» в таблице «автомобиль») –

+0

Его назначение uni, и я должен сделайте то, что мне сказали. Учитель сказал нам, что нам нужно использовать функцию и триггер. – Tom

+1

Звучит немного глупо, чтобы инициировать ваше обновление с помощью триггера 'AFTER LOGON ON DATABASE'. Почему вы не создаете 'SCHEDULER JOB' и запускаете это один раз в полночь, например? –

ответ

0

SHOW ERRORS после компиляции вашего триггера выявит все ошибки.

Вот несколько ..
1) в обновлении, это просто SET somecolumn = Somevalue
2) оракул неявно открывает курсор и закрывается, при использовании для цикла.
3) после использования цикла FOR, полученные результаты должны использоваться как .. Forloopvariable.column-name
4) добавлено Vehicle# к вашему курсору.
5) добавлена ​​логика V_date.

CREATE OR REPLACE TRIGGER tg_VehicleDepreciate 
AFTER LOGON ON DATABASE 
IS 
CURSOR vehicle_cur IS SELECT "VALUE", LastUpdate ,Vehicle# FROM Vehicle; 
V_date DATE; 
BEGIN 
FOR vehicle_rec IN vehicle_cur LOOP 

     V_date := vehicle_rec.LastUpdate; 

     WHILE V_date < SYSDATE LOOP 
      /* what are you trying here? */ 
      ---vehicle_rec."Value" := fn_Vehicle_Update("VALUE"); 

      UPDATE Vehicle 
      SET LastUpdate = ADD_MONTHS(LastUpdate, 1) 
       WHERE Vehicle# = vehicle_rec.Vehicle#; 

      V_date := ADD_MONTHS(V_date,1); 

     END LOOP; 

END LOOP 
END; 
/
Смежные вопросы