При вызове хранимой процедуры вы должны передавать переменные в скобках:
val_bday_proc(birth_date)
Кроме того, вам нужно получить фактическое значение, которое нужно вставить, потому что теперь employee_birthdate
- это просто переменная,и будет null
.Вы можете использовать :new.fieldname
, чтобы получить значение поля 'fieldname' новой записи.Нет нужды объявлять переменные для этого, поэтому ваш триггер может выглядеть следующим образом, при условии, что поле называется employee_birthdate
:
Create or Replace trigger VALIDATE_BDAY_TRIG
before insert on employee
for each row
begin
val_bday_proc(:new.employee_birthdate);
end VALIDATE_BDAY_TRIG;
Кажется, что хранимая процедура в порядке, за исключением того, что отсутствует end if;
чтобы закрыть оператор if.
Некоторые примечания:
- Вы, кажется, путаете все раньше и позже.Код в процедуре в порядке, но в сообщении об ошибке и в тексте вашего вопроса вы получили его наоборот.
- Вы можете (может быть, стоит?) Также проверить это при обновлении, в противном случае вы можете вставитьболее раннюю дату, а затем обновите ее до некоторой даты в будущемДля этого можно создать отдельный триггер или изменить текущий, чтобы он также активировался при обновлении: (
before insert or update
). - Может быть полезно иметь соглашение об именовании для триггеров, которые показывают их контекст (независимо от того, являются ли онивставить и / или обновить, уровень строки или уровень оператора).Это поможет вам найти правильный вариант, если у вас есть несколько триггеров.
- Это хорошая идея, по крайней мере, рассмотреть возможность вообще не включать это в триггер.Я усвоил трудный путь, который заключается в том, что наличие большого количества бизнес-логики в триггерах в конечном итоге повлияет на производительность, его сложно отладить и сложно изменить.Такого рода проверки могут выполняться на прикладном уровне, в котором хранятся данные о сотрудниках.