我的oracle触发器如下:CREATE TRIGGER t_k
AFTER INSERT 
ON "A主表"
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
declare v_glid B主表.关联ID%type;
begin  select B关联ID into v_glid 
    from 
      B主表 a
      ,B从表 b
      ,A从表 c 
    where 
      rtrim(a.代码)=rtrim(:new.代码)
      and a.所属年月=substr(:new.日期,1,6)
      and a.关联ID=b.关联ID
      and :new.关联ID=c.关联ID;
                 
  if :new.凭证类型='888' then 
    Update B从表 
      set 本月在途=本月在途+:new.金额合计
      where 关联ID=v_glid; 
  end if;
  
end;
/
当我insert到A主表中时,发现触发器并没有像预期那样执行,并且程序完后,
发现本来的insert语句也失效了,就是说好像根本没有执行过insert一样。
A主表insert后本来应该有的记录没找到。
后来我发现,我在触发器程序中去掉:new的引用(直接使用字符串),发现触发器就执行了。A主表的记录也insert进去了~~真是郁闷,为什么我不能在触发器里面用:new的引用?要是这样的话我怎么才可以知道insert的内容啊?

解决方案 »

  1.   

    定义变量,取:new的值,在SQL语句中执行用变量。
    另外,去掉 REFERENCING NEW AS NEW OLD AS OLD
      

  2.   

    还是不行啊~~ 我改成如下的:CREATE TRIGGER t_zsgl_kptz
    AFTER INSERT 
    ON "A从表"
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    declare 
      v_glid B主表.关联ID%type;
      v_sdm A从表.代码%type; 
      v_kpse A从表.金额%type;
      v_glid1 A从表.关联ID%type;
      v_pzlx A从表.类型%type;
    begin  v_sdm:=:new.代码; 
      v_kpse:=:new.金额;
      v_glid1:=:new.关联ID;
      v_pzlx:=:new.类型;  select a.关联ID into v_glid 
        from 
          B主表 a
          ,B从表 b
          ,A主表 c
        where 
          rtrim(a.代码)=rtrim(c.代码)
          and a.所属年月=substr(c.日期,1,6)
          and a.关联ID=b.关联ID
          and b.代码=substr(v_sdm,1,3)
          and v_glid1=c.关联ID;
                     
      if v_pzlx='888' then 
        Update B从表 
          set 本月在途=本月在途+v_kpse
          where 关联ID=v_glid; 
      end if;
      
      update B从表 set 本月合计=本月合计+1;
      
    end;
    /
    发觉还是一样,没有效果。update B从表 set 本月合计=本月合计+1;用来检查的也是没有作用~~,郁闷~~~
      

  3.   

    在SQL Plus中用DBMS_OUTPUT.PUT_LINE看看,触发器运行了没有。
      

  4.   

    试过了用变量代替,结果是一样,还是没效果。
    然后我看书,用了中间变量即 包 中的 变量 来记录。
    在Before Insert For Each Row记录每个添加的行到包中的数组中
    (v_glid is Table of ...)
    然后在After Insert的语句级触发器用for loop对每一个已记录的数组取值并查询,
    发现结果还是一样,没有效果。真邪门了。一直令我不懂得是,触发器不能执行也就算了,
    为什么相应的insert语句也没有效果?
     
     现在问题好像变成了这样:在触发器里不能在DML语句(from,where)包括触发表的主键字段(用变量存储,用包变量存储也不行?!)
    只要一包含了这些字段,触发器就无效,并且触发的语句也无效。并且也不报错。这些问题如何解决?(因为主健字段必须是用来查询的)
     
     
      

  5.   

    select a.关联ID into v_glid 
        from 
          B主表 a
          ,B从表 b
          ,A主表 c
        where 
          rtrim(a.代码)=rtrim(c.代码)
          and a.所属年月=substr(c.日期,1,6)
          and a.关联ID=b.关联ID
          and b.代码=substr(v_sdm,1,3)
          and v_glid1=c.关联ID;
    你这条语句是不是返回值有好几行!!!????