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

Błąd mutacji po włączeniu wyzwalacza wstawiania

W Oracle są dwa poziomy wyzwalaczy:poziom wiersza i poziom tabeli.

Wyzwalacze na poziomie wiersza są wykonywane for each row . Wyzwalacze na poziomie tabeli wykonywane na instrukcję, nawet jeśli instrukcja zmieniła więcej niż jeden wiersz.
W wyzwalaczu na poziomie wiersza nie możesz wybrać/zaktualizować samej tabeli, która ma wyzwalacz:otrzymasz błąd mutacji.

W takim przypadku nie ma potrzeby wystawiania instrukcji UPDATE. Po prostu spróbuj tego:

CREATE OR REPLACE TRIGGER aso_quote_cuhk_trigger
BEFORE INSERT
ON aso.aso_quote_headers_all
FOR EACH ROW
BEGIN
 :new.quote_expiration_date=sysdate+90;     
END;
/

EDYTUJ Rajesh wspomniał, że możliwe jest, że przed wstawieniem nowego wiersza OP chce zaktualizować wszystkie inne rekordy w aso_quote_headers_all tabeli.

Cóż, jest to wykonalne, ale jest to trochę trudne. Aby zrobić to poprawnie, będziesz potrzebować

  1. Pakiet pl/sql i zmienna w nagłówku pakietu, która jest modyfikowana przez wyzwalacze. Ta zmienna może być listą zawierającą identyfikatory nowo wstawionych rekordów. Poziom wiersza po wyzwalaczu wstawiania doda nowy identyfikator do listy. Zawartość tej zmiennej pakietu będzie inna dla każdej sesji, więc nazwijmy tę zmienną session_variable .
  2. Poziom wiersza po wyzwalaczu wstawiania, który dodaje nowy identyfikator do session_variable .
  3. Poziom tabeli po wstawieniu wyzwalacza, który pobierałby identyfikatory ze session_variable , przetwórz identyfikator, a następnie usuń go ze session_variable . Ten wyzwalacz może wykonać niezbędne wybory/aktualizacje w aso_quote_headers_all. Po przetworzeniu nowo wstawionego identyfikatora ten wyzwalacz powinien upewnić się, że zostanie usunięty ze session_variable .


  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 DB:Jak mogę napisać zapytanie, ignorując wielkość liter?

  2. Jak wygenerować całe DDL schematu Oracle (skryptowalne)?

  3. Wyszukiwanie tekstowe Oracle w wielu tabelach i złączeniach

  4. SQL wielokrotne zapytanie SELECT z funkcją xmlagg - dane nie są pobierane w wymagany sposób

  5. ORA-12516, TNS:listener nie mógł znaleźć dostępnej obsługi