sql >> Databasteknik >  >> RDS >> Oracle

Muteringsfel på efter insättningsutlösare

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

  1. 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 .
  2. Radnivå efter infogningsutlösare, som skulle lägga till nytt ID till session_variable .
  3. Tabellnivå efter infogningsutlösare som skulle få ID:n från session_variable , bearbeta ID:t och sedan ta bort det från session_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ån session_variable .


  1. Hur man räknar objekt i kommaseparerad lista MySQL

  2. Infogar NULL/tom sträng med libpqxx-biblioteket

  3. Hur man skapar en webbplatskarta med PHP &MySQL

  4. Mysql left join med villkor i höger tabell