sql >> Database >  >> RDS >> Oracle

DML en afhandeling van uitzonderingen - Oracle

Je miste een aantal andere delen van het boek. Ja, Steven is waar - als er een uitzondering optreedt in een blok, blijven alle voorgaande DML-effecten op hun plaats. Toch zou er in het boek moeten worden vermeld dat elke uitvoering van een SQL- of PL/SQL-instructie op het hoogste niveau (d.w.z. ook anoniem blok) een cursor voor die instructie opent en als er een uitzondering is tijdens de uitvoering van de cursor, worden alle DML-effecten uitgevoerd tijdens de uitvoering van de cursor worden teruggedraaid. Misschien geeft een eenvoudig voorbeeld u de aanwijzing...

In uw oorspronkelijke voorbeeld voerde u ...

. uit
BEGIN
    DELETE FROM dml_exception;
    raise value_error;
END;

... als de verklaring van het hoogste niveau. Ja, aan het einde van het blok, maar nog steeds binnen, je delete effecten bleven bestaan. Toch veroorzaakte je blok een uitzondering die helemaal tot aan de cursor op het hoogste niveau werd gepropageerd. Dus, om te voldoen aan de principes van atomiciteit , Oracle heeft alle wachtende effecten van de geopende cursor teruggedraaid.

Als u uw PL/SQL-blok aanroept vanuit een ander PL/SQL-blok op het hoogste niveau, dat de uitzondering verwerkt en niet opnieuw verhoogt in het PL/SQL-blok op het lagere niveau, ...

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

..., dan je delete effecten blijven bestaan. (En aangezien er geen vastlegging is in dat blok, heb je uiteindelijk een transactie in uitvoering.)




  1. SQL Agent-taak:bepalen hoe lang deze al actief is

  2. JPA-toewijzing:QuerySyntaxException:foobar is niet toegewezen...

  3. PHP while-lus in tweeën gesplitst

  4. Hoe om te gaan met zoekopdrachten met de Japanse taal met MySql?