Afhandeling van uitzonderingen Oracle PL/SQL (voorbeelden)
Wat is de afhandeling van uitzonderingen in PL/SQL?
Er treedt een uitzondering op wanneer de PL/SQL-engine een instructie tegenkomt die deze niet kan uitvoeren vanwege een fout die optreedt tijdens runtime. Deze fouten worden niet geregistreerd op het moment van compilatie en hoeven daarom alleen tijdens de runtime te worden afgehandeld.
Als de PL/SQL-engine bijvoorbeeld een instructie ontvangt om een getal door '0' te delen, zal de PL/SQL-engine dit als uitzondering genereren. De uitzondering wordt alleen tijdens runtime gegenereerd door de PL/SQL-engine.
Uitzonderingen zorgen ervoor dat het programma niet verder wordt uitgevoerd. Om een dergelijke situatie te voorkomen, moeten ze afzonderlijk worden vastgelegd en afgehandeld. Dit proces wordt Exception-Handling genoemd, waarbij de programmeur de uitzondering afhandelt die tijdens de runtime kan optreden.
Syntaxis voor afhandeling van uitzonderingen
Uitzonderingen worden afgehandeld op blokniveau, dat wil zeggen dat als er in een blok een uitzondering optreedt, de besturing uit het uitvoeringsgedeelte van dat blok komt. De uitzondering wordt dan afgehandeld in het uitzonderingsafhandelingsgedeelte van dat blok. Nadat de uitzondering is afgehandeld, is het niet mogelijk om de besturing opnieuw naar de uitvoeringssectie van dat blok te sturen.
In de onderstaande syntaxis wordt uitgelegd hoe u de uitzondering kunt opvangen en afhandelen.
BEGIN <execution block> . . EXCEPTION WHEN <exceptionl_name> THEN <Exception handling code for the “exception 1 _name’' > WHEN OTHERS THEN <Default exception handling code for all exceptions > END;
Syntaxis uitleg:
- In de bovenstaande syntaxis bevat het blok voor het afhandelen van uitzonderingen reeksen WHEN-voorwaarden om de uitzondering af te handelen.
- Elke WHEN-voorwaarde wordt gevolgd door de uitzonderingsnaam die naar verwachting tijdens de uitvoering zal verschijnen.
- Wanneer er tijdens runtime een uitzondering optreedt, zal de PL/SQL-engine in het uitzonderingsafhandelingsgedeelte zoeken naar die specifieke uitzondering. Er wordt gestart vanaf de eerste 'WHEN'-clausule en vervolgens wordt er opeenvolgend gezocht.
- Als het de afhandeling van uitzonderingen heeft gevonden voor de gegenereerde uitzondering, zal het dat specifieke gedeelte van de afhandelingscode uitvoeren.
- Als geen van de 'WHEN'-clausules aanwezig is voor de uitzondering die is gegenereerd, zal de PL/SQL-engine het 'WHEN OTHERS'-gedeelte uitvoeren (indien aanwezig). Dit is gebruikelijk voor alle uitzonderingen.
- Na het uitvoeren van de uitzondering verdwijnt de deelcontrole uit het huidige blok.
- Er kan tijdens runtime slechts één uitzonderingsdeel voor een blok worden uitgevoerd. Na uitvoering ervan slaat de controller het resterende gedeelte voor het afhandelen van uitzonderingen over en verlaat het huidige blok.
Opmerking: WANNEER ANDEREN altijd op de laatste positie van de reeks moeten staan. Het uitzonderingsafhandelingsgedeelte dat aanwezig is na WHEN OTHERS zal nooit worden uitgevoerd omdat de besturing het blok verlaat na het uitvoeren van WHEN OTHERS.
Soorten uitzonderingen
Er zijn twee soorten uitzonderingen in Pl/SQL.
- Vooraf gedefinieerde uitzonderingen
- Door de gebruiker gedefinieerde uitzondering
Vooraf gedefinieerde uitzonderingen
Oracle heeft een aantal algemene uitzonderingen vooraf gedefinieerd. Deze uitzonderingen hebben een unieke uitzonderingsnaam en foutnummer. Deze uitzonderingen zijn al gedefinieerd in het 'STANDARD'-pakket in Oracle. In code kunnen we deze vooraf gedefinieerde uitzonderingsnamen rechtstreeks gebruiken om ze af te handelen.
Hieronder staan de enkele vooraf gedefinieerde uitzonderingen
uitzondering | Error Code | Uitzondering Reden |
---|---|---|
ACCESS_INTO_NULL | ORA-06530 | Wijs een waarde toe aan de attributen van niet-geïnitialiseerde objecten |
CASE_NOT_FOUND | ORA-06592 | Aan geen van de 'WHEN'-clausules in de CASE-instructie is voldaan en er is geen 'ELSE'-clausule opgegeven |
COLLECTION_IS_NULL | ORA-06531 | Verzamelmethoden gebruiken (behalve EXISTS) of toegang krijgen tot verzamelingkenmerken in niet-geïnitialiseerde verzamelingen |
CURSOR_ALREADY_OPEN | ORA-06511 | Ik probeer een te openen cursor die al geopend is |
DUP_VAL_ON_INDEX | ORA-00001 | Het opslaan van een dubbele waarde in een databasekolom die wordt beperkt door een unieke index |
INVALID_CURSOR | ORA-01001 | Illegale cursorbewerkingen zoals het sluiten van een ongeopende cursor |
ONGELDIG NUMMER | ORA-01722 | Conversie van teken naar een getal is mislukt vanwege een ongeldig getalteken |
GEEN DATA GEVONDEN | ORA-01403 | Wanneer de 'SELECT'-instructie die de INTO-clausule bevat, geen rijen ophaalt. |
ROW_MISMATCH | ORA-06504 | Wanneer het gegevenstype van de cursorvariabele incompatibel is met het daadwerkelijke cursorretourtype |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Verzameling verwijzen met een indexnummer dat groter is dan de verzamelingsgrootte |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Verwijzende verzameling via een indexnummer dat buiten het wettelijke bereik ligt (bijvoorbeeld: -1) |
TOO_MANY_ROWS | ORA-01422 | Wanneer een 'SELECT'-instructie met INTO-clausule meer dan één rij retourneert |
VALUE_ERROR | ORA-06502 | Rekenkundige of groottebeperkingsfout (bijvoorbeeld: een waarde toewijzen aan een variabele die groter is dan de variabelegrootte) |
ZERO_DIVIDE | ORA-01476 | Een getal delen door '0' |
Door de gebruiker gedefinieerde uitzondering
In Oracle, behalve de hierboven vooraf gedefinieerde uitzonderingen, kan de programmeur zijn eigen uitzondering maken en deze afhandelen. Ze kunnen op subprogrammaniveau in het aangiftegedeelte worden aangemaakt. Deze uitzonderingen zijn alleen zichtbaar in dat subprogramma. De uitzondering die in de pakketspecificatie is gedefinieerd, is een openbare uitzondering en is zichtbaar overal waar het pakket toegankelijk is.
Syntax: Op subprogrammaniveau
DECLARE <exception_name> EXCEPTION; BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> END;
- In de bovenstaande syntaxis wordt de variabele 'uitzonderingsnaam' gedefinieerd als het type 'UITZONDERING'.
- Dit kan op dezelfde manier worden gebruikt als een vooraf gedefinieerde uitzondering.
Syntax:Op pakketspecificatieniveau
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- In de bovenstaande syntaxis is de variabele 'exception_name' gedefinieerd als 'EXCEPTION'-type in de pakketspecificatie van .
- Dit kan in de database worden gebruikt overal waar pakket 'pakketnaam' kan worden aangeroepen.
PL/SQL-verhogingsuitzondering
Alle vooraf gedefinieerde uitzonderingen worden impliciet gegenereerd wanneer de fout optreedt. Maar de door de gebruiker gedefinieerde uitzonderingen moeten expliciet worden vermeld. Dit kan worden bereikt met behulp van het zoekwoord 'RAISE'. Dit kan op elk van de hieronder genoemde manieren worden gebruikt.
Als 'RAISE' afzonderlijk in het programma wordt gebruikt, zal het de reeds gegenereerde uitzondering doorgeven aan het bovenliggende blok. Alleen in uitzonderingsblokken kan worden gebruikt, zoals hieronder weergegeven.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
Syntaxis uitleg:
- In de bovenstaande syntaxis wordt het trefwoord RAISE gebruikt in het uitzonderingsafhandelingsblok.
- Telkens wanneer het programma uitzondering “exception_name” tegenkomt, wordt de uitzondering afgehandeld en normaal voltooid
- Maar het sleutelwoord 'RAISE' in het uitzonderingsafhandelingsgedeelte zal deze specifieke uitzondering doorgeven aan het bovenliggende programma.
Opmerking: Wanneer de uitzondering in het bovenliggende blok wordt gegenereerd, moet de uitzondering die wordt gegenereerd ook zichtbaar zijn in het bovenliggende blok. Anders genereert Oracle een fout.
- We kunnen het trefwoord 'RAISE' gebruiken, gevolgd door de naam van de uitzondering, om die specifieke, door de gebruiker gedefinieerde/vooraf gedefinieerde uitzondering te verhogen. Dit kan zowel in het uitvoeringsgedeelte als in het uitzonderingsafhandelingsgedeelte worden gebruikt om de uitzondering te genereren.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Syntaxis uitleg:
- In de bovenstaande syntaxis wordt het trefwoord RAISE gebruikt in het uitvoeringsgedeelte, gevolgd door uitzondering “exception_name”.
- Dit zal deze specifieke uitzondering op het moment van uitvoering aan de orde stellen, en dit moet verder worden afgehandeld of ter sprake gebracht.
Voorbeeld 1: In dit voorbeeld gaan we kijken
- Hoe u de uitzondering declareert
- Hoe de aangegeven uitzondering te verhogen en
- Hoe het naar het hoofdblok te verspreiden
DECLARE Sample_exception EXCEPTION; PROCEDURE nested_block IS BEGIN Dbms_output.put_line(‘Inside nested block’); Dbms_output.put_line(‘Raising sample_exception from nested block’); RAISE sample_exception; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in nested block. Raising to main block’); RAISE, END; BEGIN Dbms_output.put_line(‘Inside main block’); Dbms_output.put_line(‘Calling nested block’); Nested_block; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block'); END: /
Code Verklaring:
- Coderegel 2: De variabele 'sample_exception' declareren als EXCEPTION-type.
- Coderegel 3: Declaratieprocedure genest_block.
- Coderegel 6: Afdrukken van de verklaring “Binnen genest blok”.
- Coderegel 7: De instructie 'Raising sample_exception from genest blok' wordt afgedrukt.
- Coderegel 8: De uitzondering verhogen met 'RAISE sample_exception'.
- Coderegel 10: Uitzonderingshandler voor uitzondering sample_exception in het geneste blok.
- Coderegel 11: Afdrukken van de instructie 'Uitzondering vastgelegd in genest blok. Verhogen naar hoofdblok'.
- Coderegel 12: De uitzondering verhogen naar het hoofdblok (doorgeven aan het hoofdblok).
- Coderegel 15: Afdrukken van de verklaring “Binnen het hoofdblok”.
- Coderegel 16: Het afdrukken van de instructie "Gest blok aanroepen".
- Coderegel 17: Geneste_block-procedure aanroepen.
- Coderegel 18: uitzondering
- Coderegel 19: Uitzonderingshandler voor sample_exception in het hoofdblok.
- Coderegel 20: Afdrukken van de instructie “Uitzondering vastgelegd in het hoofdblok.”
Belangrijke punten om op te merken in Uitzondering
- In functie moet een uitzondering altijd een waarde retourneren of de uitzondering verder verhogen. anders Oracle zal tijdens runtime de foutmelding 'Functie geretourneerd zonder waarde' genereren.
- Transactiecontrole-instructies kunnen worden gegeven in het uitzonderingsafhandelingsblok.
- SQLERRM en SQLCODE zijn de ingebouwde functies die het uitzonderingsbericht en de uitzonderingscode opleveren.
- Als een uitzondering niet wordt afgehandeld, worden standaard alle actieve transacties in die sessie teruggedraaid.
- RAISE_APPLICATION_ERROR (- , ) kan worden gebruikt in plaats van RAISE om de fout te melden met gebruikerscode en bericht. De foutcode moet groter zijn dan 20000 en voorafgegaan worden door '-'.
Samenvatting
Na dit hoofdstuk zou je in staat moeten zijn om aan de volgende aspecten van Pl te werken SQL uitzonderingen
- Het afhandelen van de uitzonderingen
- Definieer een uitzondering
- Verhoog de uitzondering
- Uitzondering propagatie