Sql 在创建简单DB2触发器时面临问题

Sql 在创建简单DB2触发器时面临问题,sql,triggers,db2,Sql,Triggers,Db2,尝试创建以下trriger: CREATE TRIGGER EWR.INS_STU AFTER INSERT ON EWR.STUDENT FOR EACH ROW BEGIN IF ( :NEW.ROLL_NO > 60 ) THEN INSERT INTO EWR.STUDENT_DIV VALUES ( :NEW.ROLL_NO,'P'); END IF; IF( :NEW.ROLL_NO < 60) THEN INS

尝试创建以下trriger:

CREATE TRIGGER EWR.INS_STU
AFTER INSERT ON EWR.STUDENT
    FOR EACH ROW
BEGIN
   IF ( :NEW.ROLL_NO > 60 ) THEN
      INSERT INTO EWR.STUDENT_DIV VALUES ( :NEW.ROLL_NO,'P');
   END IF;

   IF( :NEW.ROLL_NO < 60)  
   THEN
     INSERT INTO EWR.STUDENT_DIV VALUES (:NEW.ROLL_NO,'F');
   END IF;
END
!
创建触发器EWR.INS\u STU
在EWR.STUDENT上插入后
每行
开始
如果(:NEW.ROLL_NO>60),则
插入EWR.STUDENT_DIV值(:NEW.ROLL_NO,'P');
如果结束;
如果(:NEW.ROLL_NO<60)
然后
插入EWR.STUDENT_DIV值(:NEW.ROLL_NO,'F');
如果结束;
结束
!
但它给出了以下错误:

DB21034E由于该命令不是SQL语句,因此将其作为SQL语句处理 有效的命令行处理器命令。在SQL处理过程中,它返回: SQL0104N意外标记“:NEW.ROLL_NO>30)然后插入INT”是 在以下“H行开始IF”()中找到。预期标记可能包括:
“”。行号=6。SQLSTATE=42601

SQL0104N意外标记“:NEW.ROLL_NO>30)然后 在H行之后找到“插入INT” 开始 IF(“。预期标记可能包括:“”


为什么要使用带有表示法的NEW作为主机变量(:)?不需要将冒号放在变量名之前,因为这是一个只使用sql(sql pl)的触发器

此外,还必须声明如何引用标头中定义的新值

REFERENCING NEW AS N
我重新创建了你的案例,对我来说是这样的:

db2 "create table ewr.student(roll_no int)"
db2 "create table ewr.student_div(roll_no int, other char(1))"
trigger.sql

CREATE TRIGGER EWR.INS_STU
  AFTER INSERT ON EWR.STUDENT
  REFERENCING NEW AS NEW
  FOR EACH ROW
BEGIN
  IF ( NEW.ROLL_NO > 60 ) THEN
    INSERT INTO EWR.STUDENT_DIV VALUES ( NEW.ROLL_NO, 'P' );
  END IF;
  IF ( NEW.ROLL_NO < 60 ) THEN
    INSERT INTO EWR.STUDENT_DIV VALUES ( NEW.ROLL_NO, 'F' );
  END IF;
END !

db2 -td! -f trigger.sql
DB20000I  The SQL command completed successfully.
创建触发器EWR.INS\u STU
在EWR.STUDENT上插入后
将新引用为新
每行
开始
如果(NEW.ROLL_NO>60),则
插入EWR.STUDENT_DIV值(新的卷号,'P');
如果结束;
如果(新卷号<60),则
插入EWR.STUDENT_DIV值(新的卷号“F”);
如果结束;
结束!
db2-td!-f trigger.sql
DB20000I SQL命令已成功完成。

我希望这能解决您的问题。

您使用的是哪个数据库?