Наличие столбца AGE - плохой выбор, поскольку он станет неправильным, если данные в строке не обновляются регулярно.
Однако я подозреваю, что это школьное задание, и вас не волнует проблемы дизайна. Хорошо - причина, по которой ваш триггер не дает вам хорошего значения для AGE, состоит в том, что расчет просто неверен. Вы вычитаете одно свидание из другого, думая, что это даст вам разницу в годах. Это не так - это дает вам разницу в ДНЕЙ .
Правильный расчет для AGE
равен FLOOR(MONTHS_BETWEEN(SYSDATE, BIRTH_DATE) / 12)
. Поэтому ваш триггер должен показывать:
CREATE OR REPLACE TRIGGER AGE_CALC03
BEFORE INSERT OR UPDATE ON EMPLOYEES
FOR EACH ROW
BEGIN
:new.AGE := FLOOR(MONTHS_BETWEEN(SYSDATE, :new.BIRTH_DATE) / 12);
END AGE_CALC03;
Но - вернемся к проблемам со столбцом AGE. Лучший способ узнать возраст сотрудников - это вызвать функцию, которая возвращает вам возраст людей в зависимости от даты их рождения. Что-то вроде следующего:
FUNCTION COMPUTE_AGE(pinBirth_date IN DATE)
RETURN NUMBER
AS
BEGIN
RETURN FLOOR(MONTHS_BETWEEN(SYSDATE, pinBirth_date ) / 12)
END COMPUTE_AGE;
Затем избавьтесь от столбца AGE в таблице EMPLOYEES и вызывайте эту функцию каждый раз, когда вам нужен чей-то возраст, который затем будет правильным в любой данный момент времени.