表A(id,no,val1,stat1,val2,stat2,val3,stat3,...val10,stat10);
表B(value,status);1往表A中插入一条记录时,在B中产生记录的个数取决于表A中no的值,这个插入触发器如何写
2修改表A中val或stat的值,B中相应的记录也会改变,这个触发器如何写
谢谢!

解决方案 »

  1.   

    也不知道表A 和 表B 靠什么去关联,以及表B的主键。
    大体写了个,你看看吧Create Or Replace Trigger TIUA_表A
    After Insert Or Update On 表A Of No ,Value ,Status For Each Row
    Declare
    I Integer := 0;
    Begin
    If Inserting Then
         I := 0;
            Loop
             Exit When I >= Nvl(:New.No,0);
             --//循环向表B中插入数据
            End Loop;
        End If;

        
        If Updating Then
         Update 表B
               Set Value = :New.Value,
                   Status = :New.Status
             Where ……
        End If;
        
    End TIUA_表A ;
      

  2.   

    按照我自己的理解写的一个
    不知道lz要的是不是这样的?create or replace trigger insert_a
      before insert on a  
      for each row
    declare
    v_no              a.no%type;
    I                 a.no%type;
    v_sql             varchar2(8000);begin
      v_no := :new.no;
      I := 0;
      Loop
          Exit When I >= Nvl(:New.No,0);
          v_sql := 'insert into B(value,status) values (:new.val'||to_char(I)||',:new.stat'||to_char(I)||')';
          execute immediate v_sql;
      End Loop;   
    end insert_a;
      

  3.   


     谢谢上面各位,可能我描述的不是很清楚
    表A(id,no,val1,stat1,val2,stat2,val3,stat3,...val10,stat10);
    表B(r_id,id,value,status)其中r_id为主键,id同表A中的id。
    1插入触发器 当在表A中插入一条记录的时候,表B中产生相应的no条记录。先找出表B中r_id的最大值max(r_id)
     插入的记录为(max(r_id)+1,id,val1,stat1),...(max(r_id)+no,id,valno,statno)
    2更新触发器 当在表A中更新val或stat值时,表B中相应的纪录会修改。
     当表A中更新no的值时,表B中的记录会相应的增删。
    这两个触发器如何实现,谢谢!
      

  4.   

    试试!!
    create or replace trigger insert_a
      before insert on a  
      for each row
    declare
    v_no              a.no%type;
    x                 b.r_id%type;
    v_sql             varchar2(8000);
    begin
      v_no := :new.no;
      I := 0;
    select max(r_id) into x from b;
    x:=x+1;
    for i in 1..v_no loop  
          v_sql := 'insert into B(r_id,id,value,status) values (:x,:id,:val,:stat)' ;
          v_sql:=v_sql||' using x,:new.id,:new.val'||i||',:new.stat'||i;
          execute immediate v_sql ;
         x:=x+1;
      End Loop;   
    end insert_a;update触发器,可以通过判断:old.val1=:new.val1,:old.stat1=:new.stat1 如果不等,则说明更新该列,如果等,说明没有更新该列数据
    读出是第几个stat+n被更新,再到b表update相应的行!!