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

wyzwalacz, jeśli jeszcze

Składnia PL/SQL nie pozwala na uwzględnienie instrukcji SQL w klauzuli IF.

Prawidłowe podejście polega na oddzieleniu instrukcji SELECT, a następnie przetestowaniu jej wyniku. Więc to byłoby:

create or replace trigger trig1 
after insert on table_1 
for each row 
declare
    v table2.column2%type;
begin
    select table2.column2 
    into v
    from table2 
    where table2.id= :new.id;

    if v is null
    then 
        update table2 
        set table2.column2 = :new.column1 
        where table2.id = :new.id; 
    end if; 
end trig1;

Zauważ, że nie obsługuje to istnienia wielu wierszy w table2 spełniające kryteria lub rzeczywiście nie ma pasujących wierszy. Nie obsługuje również blokowania.

Pamiętaj też, że taki kod nie działa dobrze w środowiskach wielu użytkowników. Dlatego wspomniałem o blokowaniu. Naprawdę powinieneś używać logiki proceduralnej do obsługi tego rodzaju wymagań. Chociaż, jak to często bywa w przypadku źle przemyślanych wyzwalaczy, prawdziwym winowajcą jest słaby model danych. table2.column2 powinien zostać znormalizowany.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie LogMiner do znajdowania bieżących zmian

  2. Oracle wybierz najnowszy rekord daty

  3. Agregacja ciągów w Oracle:wiele wierszy w jednej kolumnie

  4. Jak zadeklarować zmienną liczbową, w której mogę zapisać liczbę tabel w mojej pętli?

  5. Identyfikowanie i rozwiązywanie zakleszczeń Oracle ITL