CREATE OR REPLACE TRIGGER TRI_Cellid_Last
 AFTER INSERT ON t_Cellid_Log
  FOR EACH ROW
BEGIN
   if INSERTING THEN
    merge into t_cellid_last last
       using t_cellid_log log
        on (log.mcc=last.mcc and log.mnc=last.mnc and log.lac=last.lac and log.cellid=last.cellid)
       WHEN MATCHENED THEN UPDATE
 SET last.longitude=:new.longitude,last.latitude=:new.latitude,last.inaccuracy=:new.inaccuracy
      where mcc=:new.mcc and mnc=:new.mnc and lac=:new.lac and cellid=:new.cellid
       WHEN NOT MATCHED THEN INSERT
      values(seq_cell_last_id.nextVal,:new.mcc,:new.mnc,:new.lac,:new.cellid,:new.longitude,:new.latitude,:new.inaccuracy,:new.UTCTIME,:new.TIMELOG)
   end if;
END;

解决方案 »

  1.   

    不知道你的逻辑是什么?为什么要在触发器里面merge?这里不要用merge了,你的业务似乎是存在相同的则修改,不存在则插入。merge在大数据量需要同步的情况下才能提高性能,你这里似乎是不用更好。改为这样试试看?if INSERTING THEN
        UPDATE t_cellid_last
        SET longitude=:new.longitude,latitude=:new.latitude,inaccuracy=:new.inaccuracy
        where mcc=:new.mcc and mnc=:new.mnc and lac=:new.lac and cellid=:new.cellid;
        if sql%NOTFOUND then --如果修改时没有找到对应的记录,则插入新记录
             INSERT into  t_cellid_last
      values( seq_cell_last_id.nextVal,:new.mcc,:new.mnc,:new.lac,:new.cellid,:new.longitude,:new.latitude,:new.inaccuracy,:new.UTCTIME,:new.TIMELOG);
      end if; 
    end if;
      

  2.   

    using t_cellid_log 这个恐怕要产生变异表错误
    而且即使能成功,每插入一条数据都去merge一次,性能很糟糕吧
    可以隔一段时间定时同步,或者不要merge,改成下面的试试
    CREATE OR REPLACE TRIGGER TRI_Cellid_Last 
    AFTER INSERT ON t_Cellid_Log 
      FOR EACH ROW 
    declare
    v_count number;
    BEGIN 
      select count(1) into v_count from t_cellid_last last
      where :new.mcc=last.mcc and :new.mnc=last.mnc and :new.lac=last.lac and :new.cellid=last.cellid and rownum<2;
      if v_count>0 then
        update t_cellid_last set longitude=:new.longitude,latitude=:new.latitude,inaccuracy=:new.inaccuracy
        where mcc=:new.mcc and mnc=:new.mnc and lac=:new.lac and cellid=:new.cellid;
      else
        insert into t_cellid_last values(seq_cell_last_id.nextVal,:new.mcc,:new.mnc,:new.lac,:new.cellid,:new.longitude,:new.latitude,:new.inaccuracy,:new.UTCTIME,:new.TIMELOG);
      end if;
    END; 
      

  3.   

    你的触发器是FOR EACH ROW
    而MERGE语句一次则进行批量更新
    这个是矛盾的,肯定存在问题!
      

  4.   

    我没试过你的SQL,不过看逻辑应该是可以跑通,谢谢帮助