从触发器调用过程以验证出生日期



我在下面创建了一个触发器(Trig 1(,以便在插入员工表之前触发。然后,该触发器将调用过程(过程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;

(过程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;

调用存储过程时,应在括号之间传递变量:

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;

存储过程似乎还可以,只是缺少了关闭if语句的end if;

一些旁注:

  • 你似乎越来越困惑。proc中的代码是可以的,但在错误消息和问题文本中,你得到了相反的结果
  • 你也可以(也许应该?(在更新时检查这个,否则你可以插入一个更早的日期,然后更新到将来的某个日期。您可以为此创建一个单独的触发器,或者将当前触发器修改为也在更新时触发:(before insert or update(
  • 为显示其上下文(无论是插入和/或更新、行级别还是语句级别(的触发器制定一个命名约定可能会有所帮助。如果你有多个触发器,这可以帮助你找到合适的触发器
  • 这是一个好主意,至少考虑一下根本不把它放在触发器中。我艰难地认识到,在触发器中包含大量业务逻辑最终会影响性能,很难调试,也很难更改。这种检查可以在存储员工数据的应用程序层中进行

最新更新