Leer hoe u uitzonderingen in PL / SQL kunt afhandelen



Dit artikel is een uitgebreide gids over het afhandelen van uitzonderingen in PL / SQL door de verschillende soorten uitzonderingen te bespreken die in PL / SQL worden aangeboden.

Als u een programmeur bent, bent u wellicht bekend met het concept van het afhandelen van uitzonderingen als een integraal onderdeel van elk . Omdat fouten onvermijdelijk zijn en zelfs de slimsten van ons fouten kunnen maken tijdens het schrijven van code, moeten we weten hoe we ermee moeten omgaan. In dit artikel zullen we vooral leren over de afhandeling van uitzonderingen in PL / SQL.

Afhandeling van SQL-uitzonderingen in PL / SQL-EdurekaHieronder staan ​​de onderwerpen die in dit artikel worden behandeld:





Wat is een uitzondering?

Elke abnormale omstandigheid of gebeurtenis die de normale stroom van onze programma-instructies tijdens de uitvoering onderbreekt, of in eenvoudige bewoordingen een uitzondering, is een fout.

Syntaxis van het afhandelen van uitzonderingen in PL / SQL

DECLARE BEGIN EXCEPTION WHEN exception1 THEN exception1-handling-statements WHEN exception2 THEN exception2-handling-statements WHEN exception3 THEN exception3-handling-statements ........ WHEN anderen THEN exception3-handling-statements END

Hier kunnen we zoveel uitzonderingen opsommen als we willen afhandelen. De standaarduitzondering wordt afgehandeld met ‘WANNEER anderen DAN’



Voorbeeld van afhandeling van uitzonderingen in PL / SQL

Het onderstaande programma toont de naam en het adres van een student wiens ID is gegeven. Aangezien er geen student met ID-waarde 8 in onze database is, genereert het programma de run-time uitzondering NO_DATA_FOUND, die wordt vastgelegd in het EXCEPTION-blok.

DECLARE s_id studentS.id% type: = 8 s_name studentS.Name% type s_loc studentS.loc% type BEGIN SELECT naam, locatie IN s_name, s_loc VAN studenten WAAR id = s_id DBMS_OUTPUT.PUT_LINE ('Naam:' || s_naam) DBMS_OUTPUT .PUT_LINE ('Locatie:' || s_loc) UITZONDERING WANNEER no_data_found THEN dbms_output.put_line ('Geen student!') WANNEER anderen DAN dbms_output.put_line ('Oeps, Fout!') EINDE

Uitvoer

Zo'n student niet! PL / SQL-procedure met succes voltooid.

Hier kunnen we zoveel uitzonderingen opsommen als we willen afhandelen. De standaarduitzondering wordt afgehandeld met ‘ WANNEER anderen DAN '

Soorten uitzonderingen in PL / SQL

  • Systeem gedefinieerd
  • Gebruiker trotseerde

Het volgende in dit artikel over het afhandelen van uitzonderingen in PL / SQL , laten we beide typen in detail bespreken.



Systeem gedefinieerd

Deze uitzonderingen worden impliciet gedefinieerd en onderhouden door de Oracle-server en worden voornamelijk gedefinieerd in het Oracle-standaardpakket. Elke keer dat er een uitzondering optreedt in het programma, komt de Oracle-server overeen met en identificeert deze de juiste uitzondering uit de beschikbare reeks uitzonderingen die beschikbaar zijn in het oracle-standaardpakket. In principe zijn deze uitzonderingen vooraf gedefinieerd in PL / SQL die wordt verhoogd WANNEER een bepaalde databaseregel wordt geschonden .

De Door het systeem gedefinieerde uitzonderingen zijn verder onderverdeeld in twee categorieën:

  • Benoemde systeemuitzonderingen
  • Systeemuitzonderingen zonder naam

Uitzonderingen op systeemnamen

De genoemde uitzonderingen voor PL / SQL zijn genoemd in het standaardpakket van PL / SQL , daarom hoeft de ontwikkelaar de PL / SQL-uitzonderingen niet in hun code te definiëren. PL / SQL biedt veel vooraf gedefinieerde benoemde uitzonderingen, die worden uitgevoerd wanneer een database-regel wordt overtreden door een programma. De volgende tabel bevat een aantal van de belangrijke vooraf gedefinieerde uitzonderingen en minus

Uitzondering Oracle-fout SQLCODE Omschrijving
ACCESS_INTO_NULL06530-6530Het wordt verhoogd wanneer aan een null-object automatisch een waarde wordt toegewezen.
CASE_NOT_FOUND06592-6592Het wordt verhoogd wanneer geen van de keuzes in de WHEN-clausule van een CASE-verklaring is geselecteerd en er is geen ELSE-clausule.
COLLECTION_IS_NULL06531-6531Het wordt verhoogd wanneer een programma probeert om andere verzamelingsmethoden dan EXISTS toe te passen op een niet-geïnitialiseerde geneste tabel of varray, of het programma probeert waarden toe te wijzen aan de elementen van een niet-geïnitialiseerde geneste tabel of varray.
DUP_VAL_ON_INDEX00001-eenHet wordt verhoogd wanneer wordt geprobeerd dubbele waarden op te slaan in een kolom met een unieke index.
INVALID_CURSOR01001-1001Het wordt verhoogd wanneer wordt geprobeerd een cursorbewerking uit te voeren die niet is toegestaan, zoals het sluiten van een ongeopende cursor.
ONGELDIG NUMMER01722-1722Het wordt verhoogd wanneer de conversie van een tekenreeks naar een getal mislukt omdat de tekenreeks geen geldig getal vertegenwoordigt.
LOGIN_DENIED01017-1017Het wordt geactiveerd wanneer een programma probeert in te loggen op de database met een ongeldige gebruikersnaam of wachtwoord.
GEEN DATA GEVONDEN01403+100Het wordt verhoogd wanneer een SELECT INTO-instructie geen rijen retourneert.
NOT_LOGGED_ON01012-1012Het wordt geactiveerd wanneer een databaseoproep wordt verzonden zonder dat er verbinding is met de database.
PROGRAM_ERROR06501-6501Het wordt verhoogd wanneer PL / SQL een intern probleem heeft.
ROWTYPE_MISMATCH06504-6504Het wordt verhoogd wanneer een cursor waarde ophaalt in een variabele met een incompatibel gegevenstype.
SELF_IS_NULL30625-30625Het wordt geactiveerd wanneer een lidmethode wordt aangeroepen, maar de instantie van het objecttype is niet geïnitialiseerd.
STORAGE_ERROR06500-6500Het wordt verhoogd wanneer PL / SQL geen geheugen meer heeft of het geheugen is beschadigd.
TOO_MANY_ROWS01422-1422Het wordt verhoogd wanneer een SELECT INTO-instructie meer dan één rij retourneert.
VALUE_ERROR06502-6502Het wordt verhoogd wanneer een rekenkundige, conversie-, afkappings- of groottebeperkingsfout optreedt.
ZERO_DIVIDE014761476Het wordt verhoogd wanneer wordt geprobeerd een getal door nul te delen.

Voorbeeld

CREËER OF VERVANG PROCEDURE add_new_student (student _id_in IN NUMBER, student _name_in IN VARCHAR2) IS BEGIN INVOEGEN IN student (student _id, student _name) WAARDEN (student _id_in, student _name_in) UITZONDERING WANNEER DUP_VAL_ON_INDEX student _2000_er raise_ -applicatie _ ) WHEN ANDERE THEN raise_application_error (-20002, 'Er is een fout opgetreden.') EINDE

Verderop in dit artikel over het afhandelen van uitzonderingen in PL / SQL, laten we begrijpen wat naamloze systeemuitzonderingen zijn.

Systeemuitzonderingen zonder naam

De systeemuitzonderingen waarvoor Oracle geen naam heeft, worden naamloze systeemuitzonderingen genoemd. Deze uitzonderingen komen niet vaak voor en zijn geschreven met een code en een bijbehorend bericht.

Er zijn in principe twee manieren om met naamloze systeemuitzonderingen om te gaan:

hoe je een programma java beëindigt

1. Met behulp van de WHEN OTHERS uitzonderingshandler

2. Koppel de uitzonderingscode aan een naam en gebruik deze als een benoemde uitzondering.

Enkele stappen die worden gevolgd voor systeemuitzonderingen zonder naam zijn:

  • Breng ze impliciet omhoog.
  • In het geval dat ze niet worden afgehandeld in ‘WHEN Others’, moeten ze expliciet worden afgehandeld.
  • Om de uitzondering expliciet af te handelen, kunnen ze worden gedeclareerd met Pragma EXCEPTION_INIT en afgehandeld door te verwijzen naar de door de gebruiker gedefinieerde uitzonderingsnaam in de uitzonderingssectie.

Een voorbeeld van het afhandelen van niet nader genoemde uitzonderingen met Pragma EXCEPTION_INIT wordt verderop in het artikel gegeven. Verderop in dit artikel over het afhandelen van uitzonderingen in PL / SQL, laten we de door de gebruiker gedefinieerde excetpions begrijpen.

Gebruiker gedefinieerde

Net als alle andere programmeertalen, kunt u met Oracle ook aangeven dat uw eigen uitzonderingen worden geïmplementeerd. In tegenstelling tot door het systeem gedefinieerde uitzonderingen, worden deze uitzonderingen expliciet vermeld in het PL / SQL-blok.

Stappen om door de gebruiker gedefinieerde uitzonderingen in de Oracle-database te declareren

We kunnen door de gebruiker gedefinieerde uitzonderingen in de Oracle-database op de volgende 3 manieren definiëren:

  • Variabele van het type UITZONDERING gebruiken

Hier kunnen we een door de gebruiker gedefinieerde uitzondering declareren door de variabele EXCEPTION te declareren data type in onze code en vermeld deze expliciet in ons programma met behulp van de RAISE-instructie.

  • Met behulp van PRAGMA EXCEPTION_INIT-functie

We kunnen een niet-voorgedefinieerd foutnummer definiëren met de variabele van EXCEPTION datatype

  • Met behulp van de RAISE_APPLICATION_ERROR-methode

Met behulp van deze methode kunnen we een door de gebruiker gedefinieerde uitzondering declareren met ons eigen aangepaste foutnummer en bericht.

Tot nu toe had u misschien een globaal idee over de manieren waarop we door de gebruiker gedefinieerde uitzonderingen in PL / SQL kunnen aankaarten. We zullen meer over elk van de bovengenoemde methoden leren met voorbeelden verderop in dit artikel over het afhandelen van uitzonderingen in PL / SQL.

Laten we vervolgens in dit artikel doorgaan met de demonstraties van door de gebruiker gedefinieerde afhandeling van uitzonderingen.

Demonstratie van door de gebruiker gedefinieerde uitzonderingen

Verderop in dit artikel over het afhandelen van uitzonderingen in PL / SQL, laten we ons begrijpen hoe we de variabele van het type EXCEPTION moeten gebruiken.

Variabele van het type UITZONDERING gebruiken

Het proces voor het declareren van een door de gebruiker gedefinieerde uitzondering is onderverdeeld in drie delen en deze drie delen zijn:

  • Declareer een datatype voor een variabele uitzondering
  • Verhoog de uitzondering
  • Behandel de uitzondering

Laten we een code schrijven om de bovenstaande stappen in detail te demonstreren.

DECLARE var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero UITZONDERING

In het bovenstaande declaratieblok hebben we vier variabelen, waarvan de eerste drie normale datatype-variabelen zijn en de vierde ex_DivZero de speciale uitzondering datatype-variabele is. De vierde is onze door de gebruiker gedefinieerde uitzondering.

DECLARE var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero UITZONDERING

Het bovenstaande uitvoeringsgedeelte van dit anonieme blok zal alleen in werking treden als de deler 0 is. Als de deler nul is zoals in ons geval, wordt de fout verhoogd en zal de besturing van het programma alle volgende stappen overslaan en zoekt naar overeenkomende uitzonderingshandler. In het geval dat het een andere vindt, zal het de actie dienovereenkomstig uitvoeren, anders zal het ofwel het programma beëindigen of ons een onverwerkte, door het systeem gedefinieerde fout geven.

UITZONDERING WANNEER ex_DivZero THEN DBMS_OUTPUT.PUT_LINE (‘ERROR, de deler mag niet nul zijn’)

Dit is de uitzonderingsafhandelaar. Zodra de gebruiker deler invoert als 0, wordt de bovenstaande berichtstring gevraagd.

Laatste code:

DECLARE var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero UITZONDERING BEGIN IF var_divisor = 0 THEN RAISE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBEGMS_OUTPUT.PUT_LINE) || var_divisor = 0 VERHOGEN DAN ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('Result =' || var_result) END

Verderop in dit artikel over het afhandelen van uitzonderingen in PL / SQL, laten we ons begrijpen hoe we de PRAGMA_EXCEPTION_INIT-methode kunnen gebruiken.

Met behulp van PRAGMA EXCEPTION_INIT-functie

In de PRAGMA EXCEPTION_INIT-functie, wordt een uitzonderingsnaam geassocieerd met een Oracle-foutnummer. Deze naam kan worden gebruikt bij het ontwerpen van de uitzonderingshandler voor de fout.Voor grote projecten met veel door de gebruiker gedefinieerde fouten is PRAGMA EXCEPTION_INIT de meest bruikbare en geschikte methode.

Syntaxis:

PRAGMA EXCEPTION_INIT (naam_uitzondering, -Oracle_fout_getal)

Voorbeeld

DECLARE deadlock_detected EXCEPTION PRAGMA EXCEPTION_INIT (deadlock_detected, -60) BEGIN NULL - Een bewerking die een ORA-00060-fout veroorzaakt UITZONDERING WANNEER deadlock_detected DAN NULL - de fout afhandelen END

De PRAGMA EXCEPTION_INIT vertelt de compiler om een ​​uitzonderingsnaam te associëren met een Oracle-foutnummer zoals eerder vermeld. Hiermee kunt u met de naam naar elke interne uitzondering verwijzen en er een specifieke handler voor schrijven. Als u een foutenstapel of een reeks foutmeldingen ziet, is de stapel bovenaan degene die kan worden opgesloten en afgehandeld.

Verderop in dit artikel over het afhandelen van uitzonderingen in PL / SQL, laten we ons begrijpen hoe we de RAISE_APPLICATION_ERROR-methode kunnen gebruiken.

Met behulp van de RAISE_APPLICATION_ERROR-methode

Het is een procedure die is ingebouwd met de Oracle-software. Met behulp van deze procedure kunnen we een foutnummer koppelen aan een aangepast foutbericht. Door zowel het foutnummer als het aangepaste foutbericht te combineren, kan een foutreeks worden samengesteld die lijkt op de standaard foutreeksen die door oracle worden weergegeven wanneer er een fout wordt aangetroffen. De procedure RAISE_APPLICATION_ERROR bevindt zich in het DBMS_STANDARD-pakket

Syntaxis

raise_application_error (error_number, message [, TRUE])

Voorbeeld

/ * Een trigger trg_emp_detail_chk wordt aangemaakt. * / CREATE OR REPLACE TRIGGER trg_emp_detail_chk / * De triggertiming wordt gedeclareerd als VOOR UPDATE op de WERKNEMERS-tabel. * / Voor UPDATE OP werknemers DECLARE toestemming_gewezen UITZONDERING BEGIN dag van de systeemtijd is zaterdag of zondag of niet. * / IF trim (TO_CHAR (sysdate, 'Day')) IN ('Saturday', 'Sunday') THEN raise_application_error (-20000, 'You are not authorised to do elke wijziging in de weekenden !! ') / * De procedure raise_application_error wordt aangeroepen met de eerste parameterwaarde als -20000 en de tweede parameter met een standaardtekst die aangeeft dat de gebruiker niet geautoriseerd is om enige wijziging aan te brengen in de weekenden. * / EINDE ALS EINDE

Hiermee komen we aan het einde van dit artikel over “Afhandeling van uitzonderingen in PL / SQL”. Ik hoop dat dit onderwerp goed is begrepen en u heeft geholpen. Probeer uw eigen codes te schrijven en gebruik de methoden die in dit artikel worden uitgelegd.

Als u door professionals op deze technologie wilt worden opgeleid, kunt u kiezen voor een gestructureerde opleiding van edureka! Kijk hier eens naar door Edureka, een vertrouwd online leerbedrijf met een netwerk van meer dan 250.000 tevreden leerlingen verspreid over de hele wereld. Deze cursus traint u in de kernconcepten en geavanceerde tools en technieken om gegevens te beheren en de MySQL-database te beheren. Het omvat hands-on leren over concepten zoals MySQL Workbench, MySQL Server, Data Modeling, MySQL Connector, Database Design, MySQL Command line, MySQL Functions etc. Aan het einde van de training ben je in staat om je eigen MySQL Database te creëren en te beheren gegevens.

Heeft u een vraag voor ons? Vermeld het in het commentaargedeelte van dit artikel 'Afhandeling van uitzonderingen in PL / SQL' en we nemen zo snel mogelijk contact met u op.