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.

Afhandeling van uitzonderingen in PL/SQL

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.

  1. Vooraf gedefinieerde uitzonderingen
  2. 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.

PL/SQL-verhogingsuitzondering

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.

PL/SQL-verhogingsuitzondering

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

PL/SQL-verhogingsuitzondering

PL/SQL-verhogingsuitzondering

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