遇到一个问题,不知道大家遇没遇到过,为了提高效率如下写,但是我试图提出来写几个function 来check old 跟 new 的值。却报错,感觉是when里面限制太多,请问有什么好的方法来检查这些update 的新旧值么?谢谢~create or replace trigger part_address_trg
AFTER INSERT OR UPDATE OF country,postal_area,address_type,geography_code_1,geography_code_2,geography_code_3 OR DELETE
ON address
FOR EACH ROW
WHEN(
NEW.country != OLD.country OR (NEW.country IS NULL AND OLD.country IS NOT NULL) OR (NEW.country IS NOT NULL AND OLD.country IS NULL) or
NEW.postal_area != OLD.postal_area OR (NEW.postal_area IS NULL AND OLD.postal_area IS NOT NULL) OR (NEW.postal_area IS NOT NULL AND OLD.postal_area IS NULL) or
NEW.address_type != OLD.address_type OR (NEW.address_type IS NULL AND OLD.address_type IS NOT NULL) OR (NEW.address_type IS NOT NULL AND OLD.address_type IS NULL) or
NEW.geography_code_1 != OLD.geography_code_1 OR (NEW.geography_code_1 IS NULL AND OLD.geography_code_1 IS NOT NULL) OR (NEW.geography_code_1 IS NOT NULL AND OLD.geography_code_1 IS NULL) or
NEW.geography_code_2 != OLD.geography_code_2 OR (NEW.geography_code_2 IS NULL AND OLD.geography_code_2 IS NOT NULL) OR (NEW.geography_code_2 IS NOT NULL AND OLD.geography_code_2 IS NULL) or
NEW.geography_code_3 != OLD.geography_code_3 OR (NEW.geography_code_3 IS NULL AND OLD.geography_code_3 IS NOT NULL) OR (NEW.geography_code_3 IS NOT NULL AND OLD.geography_code_3 IS NULL)
)
  DECLARE
ad_address_id address.address_id%TYPE;
  BEGIN
.................
END
/

解决方案 »

  1.   

    楼主的check很多都是重复的。
    比如你已经
    AFTER INSERT OR UPDATE OF country,postal_area,address_type,geography_code_1,geography_code_2,geography_code_3
    就没有必要在when里使用
    NEW.geography_code_1 != OLD.geography_code_1
      

  2.   


    建议使用updating来修改一下:
    create or replace trigger part_address_trg
        AFTER INSERT OR UPDATE OF country,postal_area,address_type,geography_code_1,geography_code_2,geography_code_3 OR DELETE
        ON address
        FOR EACH ROW
        
      DECLARE
        ad_address_id address.address_id%TYPE;
      BEGIN
        if updating('COUNTRY') then
         ----
        end if; 
        if updating('POST_AREA') then
         ----
        end if;
        if updating('ADDRESS_TYPE') then
         ----
        end if;
       
    END
    /
      

  3.   

    Begin 如果很长的话,用updating 修改也不是很方便啊。
      

  4.   

    关键是想屏蔽其他column更改带来的trigger 调用。