Oracle
 sql >> Base de données >  >> RDS >> Oracle

Déclencheur avec l'instruction Merge dans Oracle

Vous avez mélangé vos données source dans votre déclaration de fusion, je suppose. Vous ne voulez prendre en compte que les lignes insérées, n'est-ce pas ?

Je pense que votre déclencheur devrait ressembler à :

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. si :new.col5 est une colonne de date, alors changez :

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

à

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

Les années ont 4 chiffres (j'ai deviné que vous vouliez dire 2016, et non 1916 !).