Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Trigger com instrução Merge no oracle


Você tem seus dados de origem todos misturados em sua declaração de mesclagem, eu suspeito. Você só quer considerar as linhas que estão sendo inseridas, certo?

Eu acho que seu gatilho deve 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.B. se :new.col5 for uma coluna de data, altere:
FOR EACH ROW WHEN (NEW.col5 >= '01-MAY-16')

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

Os anos têm 4 dígitos (adivinhei que você quis dizer 2016, e não 1916!).