0

试图创建以下触发器:

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
!

但它给出了以下错误:

DB21034E 该命令被作为 SQL 语句处理,因为它不是有效的命令行处理器命令。在 SQL 处理期间,它返回:SQL0104N 在“H ROW BEGIN IF (”之后发现了一个意外的标记“:NEW.ROLL_NO > 30) THEN INSERT INT”。预期的标记可能包括:
“”。LINE NUMBER=6。SQLSTATE=42601

SQL0104N 在“H ROW BEGIN IF (”之后发现了意外的标记“:NEW.ROLL_NO > 30 ) THEN INSERT INT”。预期的标记可能包括:“”。

4

1 回答 1

2

为什么使用 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))"

触发器.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.

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

于 2013-04-20T09:34:17.220 回答