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

DML a zpracování výjimek - Oracle

Unikly vám některé další části knihy. Ano, Steven má pravdu – pokud se v bloku vyskytne výjimka, všechny předchozí efekty DML zůstanou na svém místě. Přesto by v knize měla být další zmínka o tom, že každé provedení příkazu SQL nebo PL/SQL na nejvyšší úrovni (tedy i anonymního bloku) otevře kurzor pro tento příkaz, a pokud během provádění kurzoru dojde k výjimce, všechny efekty DML jsou hotové. během provádění kurzoru jsou vráceny zpět. Snad vám napoví jednoduchý příklad...

V původním příkladu jste provedli ...

BEGIN
    DELETE FROM dml_exception;
    raise value_error;
END;

... jako prohlášení nejvyšší úrovně. Ano, na konci bloku, i když stále uvnitř, vaše delete efekty zůstaly na svém místě. Přesto váš blok vyvolal výjimku, která se rozšířila až ke kurzoru nejvyšší úrovně. Abychom tedy dodrželi zásady atomicity , Oracle vrátil všechny nevyřízené efekty otevřeného kurzoru.

Pokud zavoláte svůj blok PL/SQL z jiného bloku PL/SQL nejvyšší úrovně, který zpracovává a znovu nevyvolává výjimku vyvolanou v bloku PL/SQL nižší úrovně, ...

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

... a poté vaše delete účinky zůstanou na svém místě. (A protože v tomto bloku není žádné potvrzení, skončíte s probíhající transakcí.)




  1. Jak mohu vybrat řádek s maximálním počtem při sestavování skupiny

  2. Laravel SQLSTATE[HY000] [1049] Neznámá databáze 'previous_db_name'

  3. Seznam uložených procedur/funkcí Příkazový řádek Mysql

  4. MySQL větší nebo rovno operátor ignoruje svou povinnost nebo rovnou povinnost