sql >> Databasteknik >  >> RDS >> Oracle

Återställ i PLSQL-undantag

För det första antar jag att vi kan ignorera syntaxfelen (det finns till exempel ingen END LOOP , dbms_output.put_line samtalet saknar det första enstaka citatet, etc.)

Det beror på om det är nödvändigt att återställa ändringar.

I allmänhet skulle du inte ha interimistiska åtaganden i en loop. Det är generellt sett en dålig arkitektur både för att det är mycket dyrare när det gäller I/O och förfluten tid. Det gör det också mycket svårare att skriva omstartbar kod. Vad händer till exempel om din SELECT uttalandet väljer 10 rader, du utfärdar (och genomför) 5 uppdateringar och sedan misslyckas den 6:e uppdateringen? Det enda sättet att kunna starta om med den 6:e raden efter att du har fixat undantaget är att ha en separat tabell där du lagrar (och uppdaterar) din kods framsteg. Det skapar också problem för varje kod som anropar detta block som sedan måste hantera fallet att halva arbetet gjordes (och begicks) och den andra halvan inte var det.

I allmänhet skulle du bara sätta transaktionskontrollsatser i de yttersta blocken av din kod. Sedan en COMMIT eller en ROLLBACK i en procedur begår eller rullar tillbaka allt arbete som gjorts i sessionen, oavsett om det gjordes av proceduren eller inte, du vill vara mycket försiktig med att lägga till transaktionskontrolluttalanden. Vanligtvis vill du låta den som ringer bestämma om han ska begå eller återställa. Naturligtvis går det bara så långt -- så småningom kommer du att hamna i det yttersta blocket som aldrig kommer att anropas från någon annan rutin och du måste ha lämplig transaktionskontroll -- men det är något att vara väldigt försiktig med om du skriver kod som kan återanvändas.

I det här fallet, eftersom du har interimistiska åtaganden, är den enda effekten av din ROLLBACK skulle vara att om den första uppdateringssatsen misslyckades, skulle det arbete som hade gjorts i din session innan du anropade detta block återställas. Det interimistiska åtagandet skulle genomföra de tidigare ändringarna om den första uppdateringssatsen lyckades. Det är den typen av bieffekter som folk oroar sig för när de talar om varför interimistiska åtaganden och transaktionskontroll i återanvändbara block är problematiska.




  1. CONVERT_TZ – Hur man ändrar MySQL-tidszon i Query

  2. Databasen kan inte öppnas eftersom den är version 851. Denna server stöder version 782 och tidigare. En nedgraderingsväg stöds inte

  3. PostgreSQL Where count condition

  4. Lagra tid mellan poster