триггер оракул 16 возрастное ограничение - PullRequest
0 голосов
/ 14 мая 2018
CREATE OR REPLACE TRIGGER PREVENT16YRS  

BEFORE INSERT OR UPDATE OF compno ON entry

FOR EACH ROW
BEGIN
SELECT compdob
from competitor
where (2018 - EXTRACT(compdob) < 16);
raise raise_application_error( -20001, 'This is a custom error' );
END;

Хотел бы запретить 16-летнему возрасту вход в таблицу входа.Но есть некоторая синтаксическая ошибка при возникновении ошибки приложения.Некоторые советы будут высоко оценены, спасибо.:)

1 Ответ

0 голосов
/ 14 мая 2018

Нет необходимости select из целевой таблицы в триггере уровня строки.Вы можете просто получить доступ к значению столбца через запись :new.Ваш выбор, как показано, имеет дополнительную проблему, заключающуюся в том, что он будет читать всю таблицу, а не только вставленную строку.

Чтобы вызвать исключение, вы используете только raise_application_error.Ключевое слово RAISE используется только для того, чтобы повторно выдать исключение, которое было обработано в обработчике исключений.

Чтобы проверить, не превышает ли данная дата более 16 лет, вы можете использовать months_between():

CREATE OR REPLACE TRIGGER PREVENT16YRS  
  BEFORE INSERT OR UPDATE OF compno ON entry
FOR EACH ROW
BEGIN
  if months_between(current_date, :new.compdob) < 16 * 12 then
    raise_application_error( -20001, 'Too young!' );
  end;
END;
...