sql >> Base de Datos >  >> RDS >> Oracle

Desencadenar con declaración Merge en Oracle

Sospecho que tiene sus datos de origen mezclados en su declaración de combinación. Solo desea considerar las filas que se insertan, ¿verdad?

Creo que tu activador debería ser algo como:

CREATE OR REPLACE TRIGGER test_tri
   after INSERT
   ON test1
   FOR EACH ROW WHEN (NEW.col5 >= '01-MAY-16')
   DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
   IF INSERTING
   THEN
        MERGE INTO test_hist hist
        USING (select :new.package_id, :new.col1, :new.col2, :new.col3, :new.col4, :new.col5
               from   dual) t1
          ON (t1.PACKAGE_ID=hist.PACKAGE_ID)
        WHEN MATCHED THEN
          UPDATE SET hist.col5=t1.col5
        WHEN NOT MATCHED THEN
          INSERT (col1, col2, col3, col4, col5)
          VALUES (t1.col1, t1.col2, t1.col3, t1.col4, t1.col5);
   END IF;  
   COMMIT;
END;
/

nótese bien si :new.col5 es una columna de fecha, cambie:

FOR EACH ROW WHEN (NEW.col5 >= '01-MAY-16')

a

FOR EACH ROW WHEN (NEW.col5 >= to_date('01/05/2016', 'dd/mm/yyyy'))

Los años tienen 4 dígitos (¡supongo que te referías a 2016 y no a 1916!).