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ć
- 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
. - Poziom wiersza po wyzwalaczu wstawiania, który dodaje nowy identyfikator do
session_variable
. - Poziom tabeli po wstawieniu wyzwalacza, który pobierałby identyfikatory ze
session_variable
, przetwórz identyfikator, a następnie usuń go zesession_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 zesession_variable
.