Oracle
 sql >> база данни >  >> RDS >> Oracle

Възстановяване в PLSQL изключение

Първо, предполагам, че можем да игнорираме синтактичните грешки (например, няма END LOOP , dbms_output.put_line при повикване липсва първата единична кавичка и т.н.)

Що се отнася до това дали е необходимо да се върнат обратно промените, зависи.

По принцип не бихте имали междинни ангажименти в цикъл. Това като цяло е лоша архитектура, защото е много по-скъпо по отношение на I/O и изминало време. Това също прави много по-трудно писането на рестартируем код. Какво се случва, например, ако вашият SELECT оператор избира 10 реда, издавате (и ангажирате) 5 актуализации и след това 6-тата актуализация е неуспешна? Единственият начин да можете да рестартирате с 6-ия ред, след като сте коригирали изключението, е да имате отделна таблица, където сте съхранили (и актуализирали) напредъка на вашия код. Освен това създава проблеми за всеки код, който извиква този блок, който след това трябва да обработи случая, че половината работа е свършена (и ангажирана), а другата половина не е.

По принцип бихте поставили изявления за контрол на транзакциите само в най-външните блокове на вашия код. От COMMIT или ROLLBACK в процедура ангажира или отменя всяка работа, извършена в сесията, независимо дали е била извършена от процедурата, трябва да сте много внимателни при добавянето на отчети за контрол на транзакциите. Обикновено искате да позволите на повикващия да реши дали да се ангажира или да върне обратно. Разбира се, това стига само дотук-- в крайна сметка ще бъдете в най-външния блок, който никога няма да бъде извикан от някаква друга рутина и трябва да имате подходящ контрол на транзакциите-- но трябва да бъдете много предпазливи ако пишете код, който може да се използва повторно.

В този случай, тъй като имате междинни ангажименти, единственият ефект от вашия ROLLBACK би било, че ако първият оператор за актуализиране е неуспешен, работата, която е била извършена във вашата сесия преди извикването на този блок, ще бъде върната назад. Междинният ангажимент би ангажирал тези предишни промени, ако първото изявление за актуализиране е било успешно. Това е вид страничен ефект, за който хората се тревожат, когато говорят защо междинните ангажименти и контролът на транзакциите в блокове за многократна употреба са проблематични.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв тип обект връща методът за изпълнение на Spring Hibernate Template за заявка за броене в Oracle?

  2. Как да се свържа с Oracle DB от .NET?

  3. скаларна подзаявка в израза if Условие в PL/SQL

  4. Валидна заявка GROUP BY не работи, когато се комбинира с INSERT INTO на Oracle

  5. regexp за всички знаци с ударения в Oracle