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