Oracle PL / SQL-uitzonderingsafhandeling: voorbeelden om door de gebruiker gedefinieerde uitzonderingen te verhogen

Inhoudsopgave:

Anonim

Wat is het afhandelen van uitzonderingen in PL / SQL?

Er treedt een uitzondering op wanneer de PL / SQL-engine een instructie tegenkomt die niet kan worden uitgevoerd vanwege een fout die optreedt tijdens runtime. Deze fouten worden niet vastgelegd op het moment van compilatie en daarom hoefden ze 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 een uitzondering gooien. De uitzondering wordt alleen tijdens de runtime opgeworpen door de PL / SQL-engine.

Uitzonderingen zorgen ervoor dat het programma niet verder wordt uitgevoerd, dus om dergelijke omstandigheden te voorkomen, moeten ze afzonderlijk worden vastgelegd en afgehandeld. Dit proces wordt Exception-Handling genoemd, waarbij de programmeur de uitzondering afhandelt die tijdens de uitvoering kan optreden.

In deze tutorial leer je de volgende onderwerpen:

  • Syntaxis voor het afhandelen van uitzonderingen
  • Soorten uitzonderingen
  • Vooraf gedefinieerde uitzonderingen
  • Door de gebruiker gedefinieerde uitzondering
  • PL / SQL verhogen uitzondering
  • Belangrijke punten om op te merken in Uitzondering

Syntaxis voor het afhandelen van uitzonderingen

Uitzonderingen worden afgehandeld op blokniveau, dwz als er eenmaal een uitzondering in een blok voorkomt, komt de besturing uit het uitvoeringsgedeelte van dat blok. De uitzondering wordt dan afgehandeld in het uitzonderingsafhandelingsgedeelte van dat blok. Nadat de uitzondering is afgehandeld, is het niet mogelijk om de besturing terug te sturen naar het uitvoeringsgedeelte van dat blok.

De onderstaande syntaxis legt uit hoe u de uitzondering kunt opvangen en afhandelen.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Syntaxis Uitleg:

  • In de bovenstaande syntaxis bevat het blok voor het afhandelen van uitzonderingen een reeks WHEN-voorwaarden om de uitzondering af te handelen.
  • Elke WHEN-voorwaarde wordt gevolgd door de naam van de uitzondering die naar verwachting tijdens de uitvoering wordt geactiveerd.
  • Wanneer een uitzondering tijdens runtime wordt gegenereerd, zoekt de PL / SQL-engine in het uitzonderingsafhandelingsgedeelte voor die specifieke uitzondering. Het zal starten vanaf de eerste 'WHEN'-clausule en vervolgens zal het zoeken.
  • Als het de afhandeling van uitzonderingen heeft gevonden voor de uitzondering die is opgeworpen, zal het dat specifieke afhandelingscodegedeelte uitvoeren.
  • Als geen van de 'WHEN'-clausule 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, zal de deelbesturing het huidige blok verlaten.
  • Er kan slechts één uitzonderingsgedeelte worden uitgevoerd voor een blok tijdens runtime. Nadat het is uitgevoerd, slaat de controller het resterende gedeelte voor het afhandelen van uitzonderingen over en verlaat het 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 veelvoorkomende uitzonderingen vooraf gedefinieerd. Deze uitzonderingen hebben een unieke uitzonderingsnaam en een foutnummer. Deze uitzonderingen zijn al gedefinieerd in het 'STANDARD'-pakket in Oracle. In code kunnen we deze vooraf gedefinieerde uitzonderingsnaam direct gebruiken om ze af te handelen.

Hieronder staan ​​enkele vooraf gedefinieerde uitzonderingen

Uitzondering Foutcode Uitzonderingsreden
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 Verzamelingsmethoden gebruiken (behalve EXISTS) of toegang krijgen tot verzamelingsattributen op niet-geïnitialiseerde verzamelingen
CURSOR_ALREADY_OPEN ORA-06511 Probeert een cursor te openen die al is geopend
DUP_VAL_ON_INDEX ORA-00001 Een dubbele waarde opslaan 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 cijferteken
GEEN DATA GEVONDEN ORA-01403 Wanneer de 'SELECT'-instructie die de INTO-component bevat, geen rijen ophaalt.
ROW_MISMATCH ORA-06504 Wanneer het gegevenstype van de cursorvariabele niet compatibel is met het daadwerkelijke type cursorterugkeer
SUBSCRIPT_BEYOND_COUNT ORA-06533 Verwijzende collectie door een indexnummer dat groter is dan de collectieomvang
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Verwijzende verzameling op basis van een indexnummer dat buiten het wettelijke bereik valt (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 variabele grootte)
ZERO_DIVIDE ORA-01476 Een getal delen door '0'

Door de gebruiker gedefinieerde uitzondering

In Oracle kan de programmeur, behalve de hierboven gedefinieerde uitzonderingen, zijn eigen uitzondering maken en deze afhandelen. Ze kunnen worden aangemaakt op subprogrammaniveau in het declaratiegedeelte. Deze uitzonderingen zijn alleen zichtbaar in dat subprogramma. De uitzondering die is gedefinieerd in de pakketspecificatie is een openbare uitzondering, en deze is zichtbaar overal waar het pakket toegankelijk is. ​

Syntaxis: op subprogrammaniveau

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • In de bovenstaande syntaxis wordt de variabele 'naam_uitzondering' gedefinieerd als het type 'UITZONDERING'.
  • Dit kan op dezelfde manier worden gebruikt als een vooraf gedefinieerde uitzondering.

Syntaxis: op pakketspecificatieniveau

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • In de bovenstaande syntaxis wordt de variabele 'exception_name' gedefinieerd als 'EXCEPTION' type in de pakketspecificatie van .
  • Dit kan overal in de database worden gebruikt waar pakket 'pakketnaam' kan worden aangeroepen.

PL / SQL verhogen uitzondering

Alle vooraf gedefinieerde uitzonderingen worden impliciet vermeld wanneer de fout optreedt. Maar de door de gebruiker gedefinieerde uitzonderingen moeten expliciet worden vermeld. Dit kan worden bereikt met het trefwoord 'RAISE'. Dit kan op een van de onderstaande manieren worden gebruikt.

Als 'RAISE' afzonderlijk in het programma wordt gebruikt, zal het de reeds opgeworpen uitzondering doorgeven aan het bovenliggende blok. Alleen in uitzonderingsblok kan worden gebruikt zoals hieronder wordt weergegeven.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Syntaxis Uitleg:

  • In de bovenstaande syntaxis wordt het sleutelwoord RAISE gebruikt in het uitzonderingsverwerkingsblok.
  • Elke keer dat het programma de uitzondering "exception_name" tegenkomt, wordt de uitzondering afgehandeld en zal deze normaal worden voltooid
  • Maar het sleutelwoord 'RAISE' in het uitzonderingsafhandelingsgedeelte zal deze specifieke uitzondering doorgeven aan het bovenliggende programma.

Opmerking: tijdens het verhogen van de uitzondering op het bovenliggende blok, moet de gegenereerde uitzondering ook zichtbaar zijn in het bovenliggende blok, anders zal het orakel een fout genereren.

  • We kunnen het trefwoord 'RAISE' gebruiken gevolgd door de naam van de uitzondering om die specifieke door de gebruiker gedefinieerde / vooraf gedefinieerde uitzondering op te werpen. Dit kan zowel in het uitvoeringsgedeelte als in het uitzonderingsafhandelingsgedeelte worden gebruikt om de uitzondering te verhogen.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Syntaxis Uitleg:

  • In de bovenstaande syntaxis wordt het sleutelwoord RAISE gebruikt in het uitvoeringsgedeelte, gevolgd door uitzondering "naam_uitzondering".
  • Dit zal deze specifieke uitzondering aan de orde stellen op het moment van uitvoering, en dit moet verder worden afgehandeld of ter sprake gebracht.

Voorbeeld 1 : in dit voorbeeld gaan we zien

  • Hoe u de uitzondering declareert
  • Hoe de gedeclareerde uitzondering en
  • Hoe het door te geven aan het hoofdblok
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/

Code Verklaring:

  • Coderegel 2 : de variabele 'sample_exception' declareren als het type UITZONDERING.
  • Coderegel 3 : declaratieprocedure nested_block.
  • Coderegel 6 : Afdrukken van de instructie "Inside genest blok".
  • Coderegel 7: Afdrukken van de instructie "sample_exception verhogen van genest blok."
  • Coderegel 8: de uitzondering opwerpen met behulp van '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: het verhogen van de uitzondering op het hoofdblok (propageren naar het hoofdblok).
  • Coderegel 15: Afdrukken van het statement "Inside the main block".
  • Coderegel 16: de instructie "Genest blok bellen" afdrukken.
  • Coderegel 17: procedure geneste_blokkering aanroepen.
  • 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 zal Oracle de fout 'Functie geretourneerd zonder waarde' tijdens runtime gooien.
  • Transactiecontroleverklaringen kunnen worden gegeven bij het blok voor het afhandelen van uitzonderingen.
  • SQLERRM en SQLCODE zijn de ingebouwde functies die het uitzonderingsbericht en de code geven.
  • 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 verhogen met gebruikerscode en bericht. Foutcode moet groter zijn dan 20000 en wordt voorafgegaan door '-'.

Overzicht

Na dit hoofdstuk. je zou moeten kunnen werken voor de volgende aspecten van Pl SQL-uitzonderingen

  • Omgaan met de uitzonderingen
  • Definieer een uitzondering
  • Breng de uitzondering naar voren
  • Uitzondering propagatie