Oracle
 sql >> Baza danych >  >> RDS >> Oracle

DML i obsługa wyjątków — Oracle

Przegapiłeś kilka innych części książki. Tak, Steven jest prawdą – jeśli w bloku wystąpi wyjątek, wszystkie poprzednie efekty DML pozostaną na swoim miejscu. Jednak w książce powinna być inna wzmianka, że ​​każde wykonanie instrukcji SQL lub PL/SQL najwyższego poziomu (tj. również anonimowy blok) otwiera kursor dla tej instrukcji i jeśli wystąpi wyjątek podczas wykonywania kursora, wszystkie efekty DML zostaną wykonane. podczas wykonywania kursora są cofane. Być może prosty przykład da ci wskazówkę...

W oryginalnym przykładzie wykonałeś ...

BEGIN
    DELETE FROM dml_exception;
    raise value_error;
END;

... jako oświadczenie najwyższego poziomu. Tak, na końcu bloku, choć nadal w jego obrębie, Twoje delete efekty pozostały na swoim miejscu. Jednak twój blok zgłosił wyjątek, który został rozpropagowany aż do kursora najwyższego poziomu. Tak więc, aby przestrzegać zasad atomowości , Oracle wycofało wszystkie oczekujące efekty otwartego kursora.

Jeśli wywołasz swój blok PL/SQL z poziomu innego bloku PL/SQL najwyższego poziomu, który obsługuje i nie zgłasza ponownie wyjątku zgłoszonego w bloku PL/SQL niższego poziomu, ...

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

..., a następnie delete skutki pozostają na miejscu. (A ponieważ w tym bloku nie ma zatwierdzenia, transakcja jest w toku).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cofnij A, jeśli B pójdzie nie tak. wiosna boot, jdbctemplate

  2. Oracle Update Query brakuje słowa kluczowego SET — ORA97100 i ORA-00904

  3. Podziel varchar na oddzielne kolumny w Oracle

  4. Jak wybrać typ zbiorczej zebranej tabeli rekordów?

  5. Oświadczenie FORALL z klauzulą ​​INDICS-OF Bound w bazie danych Oracle