I oracle finns det två triggernivåer:radnivå och tabellnivå.
Radnivåutlösare exekveras for each row
. Tabellnivåutlösare exekveras per sats, även om en sats har ändrats mer än en rad.
I en utlösare på radnivå kan du inte välja/uppdatera själva tabellen som har triggern:du får ett mutationsfel.
I det här fallet finns det inget behov av en UPDATE-sats. Prova bara detta:
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;
/
REDIGERA Rajesh nämnde att det är möjligt att OP innan du infogar en ny rad vill uppdatera alla andra poster i aso_quote_headers_all
bord.
Tja, det här är genomförbart, men det är lite knepigt. För att göra detta korrekt behöver du
- Ett pl/sql-paket och en variabel i pakethuvudet som modifieras av utlösare. Denna variabel kan vara en lista som innehåller ID:n för nyligen infogade poster. Radnivå efter infogningsutlösare skulle lägga till ett nytt ID till listan. Innehållet i denna paketvariabel kommer att vara olika för varje session, så låt oss kalla denna variabel för
session_variable
. - Radnivå efter infogningsutlösare, som skulle lägga till nytt ID till
session_variable
. - Tabellnivå efter infogningsutlösare som skulle få ID:n från
session_variable
, bearbeta ID:t och sedan ta bort det frånsession_variable
. Denna utlösare kan utföra nödvändiga val/uppdateringar på aso_quote_headers_all. Efter att ett nyligen infogat ID har bearbetats bör den här utlösaren se till att den tas bort frånsession_variable
.