使用INSTEAD OF触发器
该触发器只能用在视图上面,可以操作视图的基表

解决方案 »

  1.   

    maohaisheng,我还是不明白,能否说得详细一点。
    重申一下,我的问题是 以上方案取其一,只要目的达到就行。
      

  2.   

    还有一个问题,当批量修改A中的COL4时,触发器执行死机,问题出在哪里?
      

  3.   

    方案一:
    建立视图c,再建立视图c   INSTEAD OF触发器
    a与b表不用建立触发器了,因为改变了a,b表,视图c也同时查询最新结果方案二:
    建立快照c,快照c改变同时返应到a,b表,a,b表的改变同时也会影响快照c
    它们之间不用建立触发器
      

  4.   

    TO BECKHAM
       如何建立快照,能不能说得详细一些。不好意思,我从来没用过快照。
      

  5.   

    但你的合并的方法,a与b表之间没有关联系,那就不能反应到a或b表上,可能这种方式行不通.
    CREATE MATERIALIZED VIEW c
    BUILD IMMEDIATE
    REFRESH FAST ON COMMIT
    ENABLE QUERY REWRITE
    as
    SELECT COL1,COL2,COL3,COL4,COL5
    FROM A  
    UNION 
    SELECT  COL1,COL2,COL3,COL4
    FROM B;
    那只能用方案一.
      

  6.   

    忘了告诉你,用union连接一两个表,那么它们之间关系表现不出来,无论做天衣无缝的计划,也实现不了.
      

  7.   

    TO BECKHAM
         按你说的建立快照时,为什么系统提示:
         ORA-12054: 无法为实体化视图设置 ON COMMIT 刷新属性。
      

  8.   

    beckham,谢谢--方案1可行:
      建立视图c的触发器如下:
      create or replace trigger updt_A_B instead of
      update on C
      declare
        par1 number(10);
        par2 number(10);
      begin
        select col2,col3 into par1,par2 from a where col1=:new.col1
        if (:new.col2=par1) and (:new.col3=par2) then
         update a set col4=:new.col4,col5=:new.col5 where col1=:new.col1 and       
             col2=:new.col2 and col3=:new.col3;
        else
         update b set col4=:new.col4 where col1=:new.col1 and col2=:new.col2 
             and col3=:new.col3;
        end if;
      end;
      
      结帖.不知如何给分,斑竹能够帮忙吧?请给beckham 80 分。
      

  9.   

    谢谢beckham 及 maohaisheng.问题解决!