Sql 创建触发器引发异常

Sql 创建触发器引发异常,sql,plsql,triggers,Sql,Plsql,Triggers,我试图在插入表之前写入触发器 它会检查特定值,如果该值无效,则会引发异常 CREATE OR REPLACE TRIGGER insert_birthdate BEFORE INSERT ON student DECLARE invalid_date EXCEPTION ; BEGIN IF(NEW.birthdate >= sysdate - interval '16' year ) THEN RAISE invalid_date ;

我试图在插入表之前写入触发器

它会检查特定值,如果该值无效,则会引发异常

CREATE OR REPLACE TRIGGER insert_birthdate
      BEFORE INSERT ON student 

DECLARE 
     invalid_date EXCEPTION ;
BEGIN
    IF(NEW.birthdate >= sysdate - interval '16' year )
    THEN RAISE invalid_date ;
    END IF ;
EXCEPTION
    WHEN invalid_date THEN
         RAISE_APPLICATION_ERROR(-20500, 'AGE MUST BE GREATER THAN 16 !!');
END;
/
它不起作用

这是输出,有什么帮助吗

Warning: Trigger created with compilation errors.

SQL>
SQL> show errors
Errors for TRIGGER INSERT_BIRTHDATE:

LINE/COL ERROR
-------- ----------------------------------------------------------
4/2      PL/SQL: Statement ignored
4/8      PLS-00201: identifier 'NEW.BIRTHDATE' must be declared
SQL>
更换这条线

IF(NEW.birthdate >= sysdate - interval '16' year )

另外,您需要为每一行而不是整个语句执行before触发器

从文件来看

在BEFORE语句触发器中,触发器主体不能读取:NEW或:OLD。(在BEFORE行触发器中,触发器主体可以读取和写入:OLD和:NEW字段。)

就这样

CREATE OR REPLACE TRIGGER orders_before_insert
BEFORE INSERT
   ON student
   FOR EACH ROW
更换这条线

IF(NEW.birthdate >= sysdate - interval '16' year )

另外,您需要为每一行而不是整个语句执行before触发器

从文件来看

在BEFORE语句触发器中,触发器主体不能读取:NEW或:OLD。(在BEFORE行触发器中,触发器主体可以读取和写入:OLD和:NEW字段。)

就这样

CREATE OR REPLACE TRIGGER orders_before_insert
BEFORE INSERT
   ON student
   FOR EACH ROW