Oracle
 sql >> база данни >  >> RDS >> Oracle

Задействане с оператор Merge в Oracle

Подозирам, че сте объркали всичките си изходни данни в изявлението си за сливане. Искате да вземете предвид само вмъкнатите редове, нали?

Мисля, че тригерът ви трябва да бъде нещо като:

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. ако :new.col5 е колона с дата, тогава променете:

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

до

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

Годините имат 4 цифри (предположих, че имахте предвид 2016, а не 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. Курсор на Oracle за присвояване

  2. Обработка на изключения за пакетно вмъкване на JDBC

  3. В кои случаи Oracle ще създава индекси автоматично?

  4. Извикване на shell скрипт от PL/SQL, но shell се изпълнява като потребител на мрежата, а не като oracle

  5. Свързване чрез клауза, за да получите върха на йерархията