Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wyzwalacz z instrukcją Merge w Oracle

Podejrzewam, że wszystkie dane źródłowe zostały pomieszane w oświadczeniu scalającym. Chcesz tylko wziąć pod uwagę wstawiane wiersze, prawda?

Myślę, że twój wyzwalacz powinien wyglądać tak:

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

Uwaga jeśli :new.col5 jest kolumną daty, zmień:

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

do

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

Lata mają 4 cyfry (domyśliłem się, że miałeś na myśli rok 2016, a nie 1916!).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sekcja inicjowania pakietu

  2. Spowodowane przez:java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver

  3. Jak usunąć zduplikowane rekordy z tabeli w Oracle?

  4. SEC_CASE_SENSTIVE_LOGON za 12c

  5. Ciągle otrzymuję błąd obok zwrotu VARCHAR(4)