sql >> Databasteknik >  >> RDS >> Oracle

Trigger med Merge-sats i oracle

Du har blandat ihop dina källdata i ditt sammanslagningsförklaring, misstänker jag. Du vill bara överväga raderna som infogas, eller hur?

Jag tror att din trigger bör vara något i stil med:

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. om :new.col5 är en datumkolumn, ändra då:

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

till

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

Årtal har fyra siffror (jag har gissat att du menade 2016 och inte 1916!).




  1. Hur kontrollerar man om en kolumn finns innan man lägger till den i en befintlig tabell i PL/SQL?

  2. hur skickar man SMS via oracle 11g? klienten är padda och i Indien måste jag skicka sms

  3. ORA-29977:Kolumntyp som inte stöds för frågeregistrering i garanterat läge

  4. ClusterControl CMON HA för distribuerad databas hög tillgänglighet - del två (GUI Access Setup)