你原来的错误在于触发器执行前并没有执行COMMIT操作,所以表中仍旧为原来的数据;
改成下面的试一下,因该能满足你的要求了,而且SQL程序中不到万不得已不要用游标:
CREATE OR REPLACE TRIGGER  yl_test03
  BEFORE insert  on a01  
  for each row
begin
    delete from b01 WHERE (b01.ID = :NEW.ID ) AND (b01.NAME = :NEW.NAME);
    
    insert into b01(id,name) values(:NEW.id,:NEW.name);
end yl_test03;

解决方案 »

  1.   

    before的时候,还没有:new值,只有:old,after后才有:new
      

  2.   

    请问楼主,每次对a01插入操作,都要对b01重新清空,全部插入,不觉得程序太累,效率极差。
    create or replace trigger yl_test03
      after insert  on a01  
      for each row
    begin
        insert into b01(id,name)
        values(:new.cur01_rec.id,:new.cur01_rec.name);
    end yl_test03;
    /
    原来数据与新增数没冲突的.
      

  3.   

    to lilylamb(小羊羔) 你说的有道理,并且before改成after也好使.
    但为何after后用游标不行,好像只要操作本表时就出错
     create or replace trigger yl_test03
      after insert  on a01  
      for each row
    declare
    id1 a01.id%type;
    begin
    select id into id1 from a01 where id=:new.id;
    end;
    ORA-04091: 表 YLMIS.A01 发生了变化,触发器/函数不能读告诉小弟为何游标不好用.
      

  4.   

    :NEW和:OLD的使用问题,
    我记得AFTER后只能用:OLD来去原来的值(记不清了,希望不会误导你,);
    你这个触发器没有定义游标,我不知道错在哪了?理论上是可以的,每个都要调试才知道错误所在!
    不用游标是因为在数据量较大时游标的效率非常低,要提高效率非常困难,
    我前几天用游标时花了10天才提高了20倍,游标的功能可以用其他的方法实现,效率都挺高的。
    不知道你还有什么问题,讲来大家研究一下!!!
      

  5.   

    我前面的意思是:after后无论使用游标还是new参数,好像都不能对主表直接引用
    如select id into id1 from a01 where id=:new.id; 会出错,象第一个帖子里的
    游标也引用了after后的新主表.
    还想请教一个新问题,在过程或函数中的形参如何定义游标,必须用包吗
      

  6.   

    不能的,你的信息还未提交;
    必须在 AS 后立即声明(BEGIN之前)才不会错误,打包是没有必要的
      

  7.   

    create or replace
    package Yjs_cwjk
    is
      type TCursor is ref cursor;
      procedure GetYjs_ckdj(Cur OUT TCursor);
    end;
    /
    create or replace
    package body Yjs_cwjk
    is
       procedure GetYjs_ckdj(Cur OUT TCursor)
      is
      begin
        OPEN Cur FOR
          SELECT *
          FROM Yjs_ckdj
          ORDER BY ckdh;
      end; 
    end;在包中好用但不用包无法声明游标