sql >> Database teknologi >  >> RDS >> Oracle

DML og undtagelseshåndtering - Oracle

Du gik glip af nogle andre dele af bogen. Ja, Steven er sandt – hvis der opstår en undtagelse i en blok, forbliver alle foregående DML-effekter på plads. Alligevel bør der være en anden omtale i bogen, at enhver SQL- eller PL/SQL-sætning på øverste niveau (dvs. også anonym blokering) åbner en markør for den sætning, og hvis der er en undtagelse under markørens udførelse, udføres alle DML-effekter under markørens udførelse rulles tilbage. Måske vil et simpelt eksempel give dig et fingerpeg...

I dit originale eksempel udførte du ...

BEGIN
    DELETE FROM dml_exception;
    raise value_error;
END;

... som erklæring på øverste niveau. Ja, i slutningen af ​​blokken, men stadig inden for, din delete effekter forblev på plads. Alligevel rejste din blokering en undtagelse, som blev spredt helt op til markøren på øverste niveau. For således at overholde principperne for atomicitet , Oracle rullede alle ventende effekter af den åbnede markør tilbage.

Hvis du kalder din PL/SQL-blok inde fra en anden PL/SQL-blok på øverste niveau, som håndterer og ikke re-hæver undtagelsen, der er rejst i PL/SQL-blokken på lavere niveau, ...

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

..., derefter din delete virkningerne forbliver på plads. (Og da der ikke er nogen commit i den blok, ender du med at have en transaktion i gang.)




  1. Forklaring af JSONB introduceret af PostgreSQL

  2. to_date fejl under brug af substr

  3. Forårstransaktion og rollback på flere borde

  4. læser utf-8-indhold fra mysql-tabel