Процедура вызова из триггера для подтверждения даты рождения - PullRequest
0 голосов
/ 26 ноября 2018

Я создал триггер ниже (Trig 1), который будет срабатывать перед вставкой в ​​таблицу сотрудников.Затем этот триггер вызовет процедуру (Proc 1), которая проверит дату рождения не ранее текущей даты.если не продолжить вставку, но если дата более ранняя, чем текущая, будет показано сообщение типа «недопустимая дата рождения».(Trig 1)

create or replace trigger VALIDATE_BDAY_TRIG
before insert on employee
for each row
declare 
    birth_date date;
    employee_birthdate date;
begin
    birth_date := employee_birthdate;
    val_bday_proc birth_date;
end VALIDATE_BDAY_TRIG;

(Proc 1)

create or replace procedure val_bday_proc(
    date_of_birth in date)
as 
begin
    if date_of_birth > current_date()
        then raise_application_error(-20000, 'Employee birth date should not be earlier than the current date');
end;

1 Ответ

0 голосов
/ 26 ноября 2018

При вызове хранимой процедуры вы должны передавать переменные в скобках:

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).
  • Может быть полезно иметь соглашение об именовании для триггеров, которые показывают их контекст (независимо от того, являются ли онивставить и / или обновить, уровень строки или уровень оператора).Это поможет вам найти правильный вариант, если у вас есть несколько триггеров.
  • Это хорошая идея, по крайней мере, рассмотреть возможность вообще не включать это в триггер.Я усвоил трудный путь, который заключается в том, что наличие большого количества бизнес-логики в триггерах в конечном итоге повлияет на производительность, его сложно отладить и сложно изменить.Такого рода проверки могут выполняться на прикладном уровне, в котором хранятся данные о сотрудниках.
...