各位大侠:
小弟最近碰到一个问题,关于oracle触发器的,想请教下,具体如下:
有两个表A和B,A中有一个字段NUMOFB记录B中记录的个数,想创建一个触发器,在对B表
进行插入和删除的时候,更新A表中NUMOFB的内容。如何实现?
谢谢各位!

解决方案 »

  1.   

    for example:
    create or replace trigger test
      AFTER  INSERT OR DELETE ON B
      for each row
    declare
    begin
         if inserting then 
          update A set NUMOFB=NUMOFB+1;
         else
          update A set NUMOFB=NUMOFB-1;
         end if;
    end test;
    /
      

  2.   

    -- 每次更新数据量很少时,可用1楼的行触发器方法.-- 如果批量insert or delete,比如说上万条,可采用以下的方式:-- 思路:
    -- 用包头作一个全局变量,记录触发器触发次数;
    -- 并创建一个before trigger 和-个after trigger,它们作用分别为统计影响的记录数 和 将影响的记录数写入A表;
    -- (made by sleepzzzzz)CREATE OR REPLACE PACKAGE pkg_test AS-- 创建全局变量
      v_recordcount number := 0;
    END pkg_test;
    /   create or replace trigger name_tri   -- 统计行级触发的次数,其实就是统计影响的记录数
      before insert or delete on tableB
      for each row 
    begin
      if inserting then
      pkg_test.v_recordcount := pkg_test.v_recordcount + 1;
      else
      pkg_test.v_recordcount := pkg_test.v_recordcount - 1;
      end if;
    end name_tri;
    /create or replace trigger name_tri_after
      after insert or delete on tableB
    begin
      update tableA set NUMOFB =  NUMOFB + pkg_test.v_recordcount;   -- 更新A表
      pkg_test.v_recordcount := 0;   -- 每次触发完毕进行清零   
    end name_tri_after;
    /   
    -- 测试:
    SQL> select * from tableA;    -- 原始值为1    NUMOFB
    ----------
             1SQL> insert into tableB select id,name from test3;  -- 表test3有万条记录10000 rows insertedSQL> select * from tableA;   -- 批量增加2条后,总数+1W    NUMOFB
    ----------
         10001SQL> delete from tableB where id = 1001;1 row deletedSQL> select * from tableA;   -- 删除一行后,总数-1    NUMOFB
    ----------
         10000
      

  3.   

    要是sqlserver 很好办,它有个映射表叫inserted,
    找了一下,oracle对语句的触发不会去自动统计它影响的记录数,只好用其它方法解决了.
      

  4.   

    create or replace trigger test
      AFTER  INSERT OR DELETE ON B
      for each row
    declare
    begin
        If inserting then
           update A set NUMOFB=NUMOFB+1;
        ElsIf DELETING THEN
           update A set NUMOFB=NUMOFB-1;
        End If;
    end test; 
      

  5.   

    sql%rowcount可以统计出sql影响的行数!
      

  6.   

    2和4楼的朋友貌似这样写不可以吧?
    没办法AFTER后面出发一个之前更新的东西。好像要写过程实现
      

  7.   

    我之前没用过trigger,刚做了个测试,这会将代码贴上来.CREATE OR REPLACE TRIGGER TEST_TIG
      AFTER INSERT OR DELETE ON TEST
      FOR EACH ROW
    DECLARE
    BEGIN
      IF INSERTING THEN
        UPDATE A SET COUNT = nvl(COUNT, 0) + 1;
      ELSE
        UPDATE A SET COUNT = nvl(COUNT, 0) - 1;
      END IF;
    END TEST_TIG;
    当我insert into test values('200801',123);时
    select COUNT from A的值为增1,如delete掉test表中一条记录时,A表的COUNT相应减少一条值.
    值的注意的一点是,第一次insert test表时,由于没给A表中的count字段初始化为0,所以这个trigger不起作用.
    只要加个nvl(count,0)就行了.
      

  8.   

    触发器在使用过程中会遇到很多问题,一般只用来实现较复杂的完整性约束,像这个问题不如查询对B表的DML操作再更新A表字段