sql >> Databáze >  >> RDS >> Oracle

Chyba mutace po vložení spouštěče

V oracle existují dvě úrovně spouštěčů:úroveň řádku a úroveň tabulky.

Spouštěče na úrovni řádku se spouštějí for each row . Spouštěče na úrovni tabulky provedené na příkaz, i když příkaz změnil více než jeden řádek.
Ve spouštěči na úrovni řádku nemůžete vybrat/aktualizovat samotnou tabulku, která má spouštěč:zobrazí se chyba mutace.

V tomto případě není potřeba příkaz UPDATE. Zkuste toto:

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;
/

UPRAVIT Rajesh zmínil, že je možné, že před vložením nového řádku chce OP aktualizovat všechny ostatní záznamy v aso_quote_headers_all tabulka.

No, to je možné, ale je to trochu složitější. Chcete-li to provést správně, budete potřebovat

  1. Balík pl/sql a proměnná v hlavičce balíčku, která je upravena spouštěči. Tato proměnná může být seznam obsahující ID nově vložených záznamů. Úroveň řádku po aktivaci vložení přidá do seznamu nové ID. Obsah této proměnné balíčku se bude pro každou jinou relaci lišit, proto tuto proměnnou nazvěme session_variable .
  2. Úroveň řádku po vložení pravidla, které by přidalo nové ID do session_variable .
  3. Úroveň tabulky po vložení pravidla, které by získalo ID z session_variable , zpracujte ID a poté jej odeberte z session_variable . Tento spouštěč by mohl provést nezbytné výběry/aktualizace na aso_quote_headers_all. Po zpracování nově vloženého ID by toto pravidlo mělo zajistit, aby bylo odstraněno z session_variable .


  1. Datový typ záznamu založený na kurzoru s kurzorem vracejícím více hodnot v databázi Oracle

  2. Jak vytvořit pohled na SQL Server

  3. Jak můžeme zjistit, že sloupec v mé tabulce Oracle je naplněn/aktualizován spouštěčem jiné tabulky?

  4. Jak zkontrolovat, zda v databázi existuje tabulka nebo sloupec?