sql >> Database >  >> RDS >> Oracle

Trigger met samenvoegen-instructie in orakel

Je hebt je brongegevens helemaal door elkaar gehaald in je samenvoegverklaring, vermoed ik. Je wilt alleen rekening houden met de rijen die worden ingevoegd, toch?

Ik denk dat je trigger zoiets zou moeten zijn als:

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;
/

NB als :new.col5 een datumkolom is, verander dan:

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

naar

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

Jaartallen hebben 4 cijfers (ik vermoedde dat je 2016 bedoelde, en niet 1916!).




  1. het ophalen van een byte-array van een LONG RAW van oracle db

  2. ORA-01840:invoerwaarde niet lang genoeg voor datumnotatie in Oracle Insert met Select

  3. Detecteer, verwijder lege kolommen en werk de database bij in sql, oracle

  4. Controleer of de waarde bestaat voordat u deze in MySQL DB invoegt in een PHP-script