当表contact中有数据插入时,把插入时间和id复制到对应的sync_log日志表中。当表内有此id时执行更新,没有此id则插入。
不使用merge into语句的触发器可以正常工作,但使用了merge into语句的无法工作。请问我的merge语句存在什么错误。
具体触发器分别如下:
--不使用merge into语句(正常工作):
CREATE OR REPLACE TRIGGER trigger_on_contact AFTER INSERT ON contact FOR EACH ROW
DECLARE C_USER VARCHAR(20);
BEGIN
      SELECT SYS_CONTEXT('userenv','session_user') into C_USER FROM DUAL;
      IF C_USER != 'SCOTT' THEN
update sync_log
                SET 
                      type_field = 'N',
                      time_field = CURRENT_TIMESTAMP
                WHERE source_field = 'contact' AND key_field=:NEW.ID_CONTACT 
                AND EXISTS(select 1 from sync_log where source_field = 'contact' AND key_field = :NEW.ID_CONTACT);
                INSERT INTO sync_log (source_field,key_field,type_field,time_field)values('contact',:NEW.ID_CONTACT,'N',CURRENT_TIMESTAMP);
      END IF;
END;--使用merge into语句如下(可以建立触发器,但触发时报错):
CREATE OR REPLACE TRIGGER trigger_on_contact AFTER INSERT ON contact FOR EACH ROW
DECLARE C_USER VARCHAR(20);
BEGIN
      SELECT SYS_CONTEXT('userenv','session_user') into C_USER FROM DUAL;
      IF C_USER != 'SCOTT' THEN
MERGE INTO SYNC_LOG L
USING(SELECT ID_CONTACT FROM contact) T
         ON (L.key_field=T.ID_CONTACT and L.key_field=:NEW.ID_CONTACT and L.source_field='contact')
WHEN MATCHED THEN UPDATE SET L.type_field = 'N',L.time_field = CURRENT_TIMESTAMP
      WHEN NOT MATCHED THEN INSERT (L.source_field,L.key_field,L.type_field,L.time_field)values('contact',:NEW.ID_CONTACT,'N',CURRENT_TIMESTAMP);
      END IF;
END;

解决方案 »

  1.   

    哎……还是得靠自己,搞了1天多终于搞定。注意dual.summy is not null那句,如果没有这句when not matched then update blabla……会不工作。
    CREATE OR REPLACE TRIGGER trigger_on_contact AFTER INSERT ON scott.contact FOR EACH ROW
    DECLARE C_USER VARCHAR(20);
    BEGIN
          SELECT SYS_CONTEXT('userenv','session_user') into C_USER FROM DUAL;
          IF C_USER != 'SCOTT' THEN
    MERGE INTO SCOTT.SYNC_LOG s
    USING DUAL
    ON (dual.dummy is not null and s.key_field=:NEW.ID_CONTACT and s.source_field='contact')
    WHEN MATCHED THEN UPDATE SET s.type_field = 'N',s.time_field = CURRENT_TIMESTAMP
          WHEN NOT MATCHED THEN INSERT (s.key_field,s.source_field,s.type_field,s.time_field)values(:NEW.ID_CONTACT,'contact','N',CURRENT_TIMESTAMP);
          END IF;
    END;