sql >> Databasteknik >  >> RDS >> Oracle

DML och undantagshantering - Oracle

Du missade några andra delar av boken. Ja, Steven är sant – om ett undantag inträffar i ett block förblir alla föregående DML-effekter på plats. Ändå bör det finnas annat omnämnande i boken att alla SQL- eller PL/SQL-satser på toppnivå (dvs. anonymt block också) öppnar en markör för den satsen och om det finns ett undantag under markörens körning, görs alla DML-effekter under markörens körning rullas tillbaka. Ett enkelt exempel kanske ger dig ledtråden...

I ditt ursprungliga exempel körde du ...

BEGIN
    DELETE FROM dml_exception;
    raise value_error;
END;

... som uttalande på högsta nivå. Ja, i slutet av blocket, men fortfarande inom, din delete effekterna kvarstod. Ändå skapade ditt block ett undantag som spred sig hela vägen upp till markören på översta nivån. Således, för att följa principerna för atomicitet , Oracle rullade tillbaka alla väntande effekter av den öppnade markören.

Om du anropar ditt PL/SQL-block från ett annat PL/SQL-block på toppnivå, som hanterar och inte återhöjer undantaget som höjts i PL/SQL-blocket på lägre nivå, ...

BEGIN
    BEGIN
        DELETE FROM dml_exception;
        raise value_error;
    END;
EXCEPTION
    WHEN others THEN NULL;
END;

..., sedan delete effekter ska finnas kvar. (Och eftersom det inte finns någon commit i det blocket, slutar du med att en transaktion pågår.)




  1. Gå med Eliminering:När SQL Server tar bort onödiga tabeller

  2. Jämför String i Oracle Case When

  3. Hur man lagrar en Java Instant i en MySQL-databas

  4. MYSQL/PHP SELECT DISTINCT