触发oracle 16年龄限制

trigger oracle 16 age limit

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岁入场table。但是在引发应用程序错误时存在一些语法错误。一些建议将不胜感激谢谢。 :)

不需要在行级别触发器中从目标 table select。您可以简单地通过 :new 记录访问列的值。如图所示,您的 select 还有一个问题,即它会读取整个 table,而不仅仅是插入的行。

要引发异常,您只需使用 raise_application_errorRAISE 关键字仅用于重新引发在异常处理程序中处理的异常。

要检查给定日期是否超过 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;