sql >> Database >  >> RDS >> Oracle

Terugdraaien in PLSQL-uitzondering

Ten eerste ga ik ervan uit dat we de syntaxisfouten kunnen negeren (er is bijvoorbeeld geen END LOOP , de dbms_output.put_line oproep mist het eerste enkele aanhalingsteken, enz.)

Of het nodig is om wijzigingen terug te draaien, hangt ervan af.

Over het algemeen heb je geen tussentijdse commits in een lus. Dat is over het algemeen een slechte architectuur, zowel omdat het veel duurder is in termen van I/O en verstreken tijd. Het maakt het ook veel moeilijker om herstartbare code te schrijven. Wat gebeurt er bijvoorbeeld als uw SELECT statement selecteert 10 rijen, geeft (en begaat) 5 updates, en dan mislukt de 6e update? De enige manier om te kunnen herstarten met de 6e rij nadat je de uitzondering hebt opgelost, is door een aparte tabel te hebben waarin je de voortgang van je code hebt opgeslagen (en bijgewerkt). Het zorgt ook voor problemen voor elke code die dit blok aanroept en vervolgens het geval moet afhandelen dat de helft van het werk is gedaan (en vastgelegd) en de andere helft niet.

Over het algemeen zou u alleen transactiecontroleverklaringen in de buitenste blokken van uw code plaatsen. Sinds een COMMIT of een ROLLBACK in een procedure al het werk dat in de sessie is gedaan, vastlegt of terugdraait, of het nu wel of niet door de procedure is gedaan, moet u zeer voorzichtig zijn met het toevoegen van transactiecontroleverklaringen. Over het algemeen wil je de beller de beslissing laten nemen om te committen of terug te draaien. Natuurlijk gaat dat maar zo ver - uiteindelijk kom je in het buitenste blok dat nooit vanuit een andere routine zal worden gebeld en moet je de juiste transactiecontrole hebben - maar het is iets om erg op je hoede te zijn over of u code schrijft die mogelijk opnieuw kan worden gebruikt.

In dit geval, aangezien je tussentijdse commits hebt, is het enige effect van je ROLLBACK zou zijn dat als de eerste update-instructie mislukt, het werk dat in uw sessie was gedaan voordat dit blok werd aangeroepen, zou worden teruggedraaid. De tussentijdse vastlegging zou die eerdere wijzigingen vastleggen als de eerste update-instructie succesvol was. Dat is het soort neveneffect waar mensen zich zorgen over maken als ze praten over waarom tussentijdse commits en transactiecontrole in herbruikbare blokken problematisch zijn.




  1. Veelgebruikte manier om tijdstempels te vergelijken in Oracle, PostgreSQL en SQL Server

  2. Hoe een tijdelijke kolom te gebruiken in de waar-clausule?

  3. Puppet en Postgres vervelende waarschuwing:versie doorgeven aan postgresql::server is verouderd

  4. mysql pdo-verbinding wordt niet gesloten?