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

时间:2018-11-26 13:33:43

标签: sql oracle plsql database-trigger

我在(Trig 1)下面创建了一个触发器,以便在插入到employee表中之前触发。然后,此触发器将调用过程(Proc 1),该过程将验证生日是否早于当前日期。如果没有继续插入,但如果日期早于当前日期,则会显示类似“无效的生日”的消息。 (触发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;

1 个答案:

答案 0 :(得分:4)

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

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语句。

一些注意事项:

  • 您似乎早晚会感到困惑。 proc中的代码还可以,但是在错误消息和问题文本中,您却可以找到它。
  • 您还可以(也许应该?)在更新时进行检查,否则可以插入一个较早的日期,然后将其更新为将来的某个日期。您可以为此单独触发,或修改当前触发以在更新时触发(before insert or update)。
  • 为显示其上下文的触发器(无论是插入和/或更新,行级还是语句级)建立命名约定可能会有所帮助。如果您有多个触发器,这可以帮助您找到合适的触发器。
  • 这是一个好主意,至少应考虑完全不触发此事件。我了解到很难的方式,即触发器中包含大量业务逻辑最终会影响性能,难以调试且难以更改。这些检查可以在存储员工数据的应用程序层中进行。