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

Wycofanie zmian w wyjątku PLSQL

Po pierwsze, zakładam, że możemy zignorować błędy składniowe (na przykład nie ma END LOOP , dbms_output.put_line w połączeniu brakuje pierwszego pojedynczego cudzysłowu itp.)

To, czy konieczne jest cofnięcie zmian, zależy od tego.

Ogólnie rzecz biorąc, nie będziesz miał tymczasowych zmian w pętli. Jest to generalnie słaba architektura, ponieważ jest znacznie bardziej kosztowna pod względem we/wy i czasu, który upłynął. To również znacznie utrudnia pisanie kodu, który można ponownie uruchomić. Co się stanie, na przykład, jeśli Twój SELECT instrukcja wybiera 10 wierszy, wydajesz (i zatwierdzasz) 5 aktualizacji, a następnie 6. aktualizacja kończy się niepowodzeniem? Jedynym sposobem na ponowne uruchomienie z szóstym wierszem po naprawieniu wyjątku byłoby posiadanie oddzielnej tabeli, w której zapisałeś (i aktualizujesz) postęp kodu. Stwarza to również problemy dla każdego kodu, który wywołuje ten blok, który musi następnie obsłużyć przypadek, w którym połowa pracy została wykonana (i zatwierdzona), a druga połowa nie.

Ogólnie rzecz biorąc, deklaracje kontroli transakcji umieszczasz tylko w najbardziej zewnętrznych blokach kodu. Od COMMIT lub ROLLBACK w procedurze zatwierdza lub wycofuje wszelką pracę wykonaną w sesji, niezależnie od tego, czy została wykonana przez procedurę, czy nie, chcesz być bardzo ostrożny przy dodawaniu instrukcji kontroli transakcji. Generalnie chcesz, aby dzwoniący podjął decyzję o zatwierdzeniu lub wycofaniu. Oczywiście to tylko tak daleko — w końcu znajdziesz się w najbardziej zewnętrznym bloku, który nigdy nie zostanie wywołany z innej procedury i musisz mieć odpowiednią kontrolę transakcji — ale należy być bardzo ostrożnym o tym, czy piszesz kod, który może zostać ponownie wykorzystany.

W tym przypadku, ponieważ masz tymczasowe zatwierdzenia, jedyny efekt twojego ROLLBACK byłoby to, że jeśli pierwsza instrukcja aktualizacji nie powiedzie się, praca wykonana w sesji przed wywołaniem tego bloku zostanie wycofana. Zatwierdzenie tymczasowe zatwierdzi poprzednie zmiany, jeśli pierwsza instrukcja aktualizacji zakończy się pomyślnie. Jest to rodzaj efektu ubocznego, o który ludzie martwią się, gdy mówią o tym, dlaczego tymczasowe zatwierdzenia i kontrola transakcji w blokach wielokrotnego użytku są problematyczne.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego to zapytanie spowodowałoby scalanie kartezjańskie w Oracle?

  2. Dodawanie nazwy schematu do encji w danych Spring?

  3. Jak zoptymalizować aktualizację SQL, która działa na tabeli Oracle z 700 mln wierszy?

  4. Jak wykonać skrypt Oracle sql za pomocą kodu java?

  5. SSIS konwertuje Varchar2 na DT_STR