在创建简单的DB2触发器时遇到问题

时间:2013-04-19 09:49:04

标签: 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
     INSERT INTO EWR.STUDENT_DIV VALUES (:NEW.ROLL_NO,'F');
   END IF;
END
!

但它出现以下错误:

  

DB21034E该命令作为SQL语句处理,因为它不是   有效的命令行处理器命令。在SQL处理期间,它返回:   SQL0104N意外的令牌&#34;:NEW.ROLL_NO&gt; 30)然后插入INT&#34;是   发现以下&#34; H ROW BEGIN IF(&#34;。预期的代币可能包括:
  &#34;&#34 ;. LINE NUMBER = 6。 SQLSTATE = 42601

     

SQL0104N意外的令牌&#34;:NEW.ROLL_NO&gt; 30)然后         INSERT INT&#34;被发现在&#34; H ROW之后   开始       IF(&#34;。预期的代币可能包括:&#34;&#34;。

1 个答案:

答案 0 :(得分: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))"

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.

我希望这可以解决你的问题。

相关问题