Als je een programmeur bent, ben je misschien bekend met het concept van het afhandelen van uitzonderingen, een integraal onderdeel van elke programmeertaal. Omdat fouten onvermijdelijk zijn en zelfs de slimsten van ons fouten kunnen maken tijdens het schrijven van code, moeten we weten hoe we ermee om moeten gaan. In dit artikel zullen we met name leren over het afhandelen van uitzonderingen in PL/SQL.
Hieronder staan de onderwerpen die in dit artikel worden behandeld:
- Wat is een uitzondering?
- Syntaxis voor het afhandelen van uitzonderingen
- Soorten uitzonderingen
- Systeem gedefinieerd
- Benoemde systeemuitzonderingen
- Naamloze systeemuitzonderingen
- Door gebruiker gedefinieerd
- Stappen om door de gebruiker gedefinieerde functies te declareren
- Voorbeelden van door de gebruiker gedefinieerde functies
- Systeem gedefinieerd
Wat is een uitzondering?
Elke abnormale toestand of gebeurtenis die de normale stroom van onze programma-instructies tijdens runtime onderbreekt of, in eenvoudige bewoordingen een uitzondering, is een fout.
Syntaxis voor het afhandelen van uitzonderingen in PL/SQL
DECLARE <declarations section> BEGIN <executable command(s)> EXCEPTION <exception handling goes here > WHEN exception1 THEN exception1-handling-statements WHEN exception2 THEN exception2-handling-statements WHEN exception3 THEN exception3-handling-statements ........ WHEN others THEN exception3-handling-statements END;
Hier kunnen we zoveel uitzonderingen opsommen als we willen afhandelen. De standaarduitzondering wordt afgehandeld met 'WHEN anderen THEN'
Voorbeeld van afhandeling van uitzonderingen in PL/SQL
Het onderstaande programma toont de naam en het adres van een student wiens ID wordt gegeven. Aangezien er geen student met ID-waarde 8 in onze database is, roept het programma de runtime-uitzondering NO_DATA_FOUND op, die is vastgelegd in het EXCEPTION-blok.
DECLARE s_id studentS.id%type := 8; s_name studentS.Name%type; s_loc studentS.loc%type; BEGIN SELECT name, loation INTO s_name, s_loc FROM students WHERE id = s_id; DBMS_OUTPUT.PUT_LINE ('Name: '|| s_name); DBMS_OUTPUT.PUT_LINE ('Location: ' || s_loc); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('No such student!'); WHEN others THEN dbms_output.put_line('Oops, Error!'); END;
Uitvoer
No such student! PL/SQL procedure successfully completed.
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 getrotseerd
Laten we in dit artikel over het afhandelen van uitzonderingen in PL/SQL nader ingaan op beide typen.
Systeem gedefinieerd
Deze uitzonderingen worden impliciet gedefinieerd en onderhouden door de Oracle-server en worden voornamelijk gedefinieerd in het Oracle Standard Package. Telkens wanneer zich een uitzondering voordoet 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 standaardpakket van orakel. In principe zijn deze uitzonderingen voorgedefinieerd 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
- Naamloze systeemuitzonderingen
Benoemde systeemuitzonderingen
De genoemde PL/SQL-uitzonderingen worden 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 databaseregel door een programma wordt geschonden. De volgende tabel bevat een aantal van de belangrijke vooraf gedefinieerde uitzonderingen −
Uitzondering | Oracle-fout | SQLCODE | Beschrijving |
ACCESS_INTO_NULL | 06530 | -6530 | Het wordt verhoogd wanneer een null-object automatisch een waarde krijgt. |
CASE_NOT_FOUND | 06592 | -6592 | Het wordt weergegeven wanneer geen van de keuzes in de WHEN-clausule van een CASE-instructie is geselecteerd en er geen ELSE-clausule is. |
COLLECTION_IS_NULL | 06531 | -6531 | Het treedt op wanneer een programma probeert om andere verzamelmethoden dan EXISTS toe te passen op een niet-geïnitialiseerde geneste tabel of varray, of als het programma probeert waarden toe te wijzen aan de elementen van een niet-geïnitialiseerde geneste tabel of varray. |
DUP_VAL_ON_INDEX | 00001 | -1 | Het treedt op wanneer er wordt geprobeerd dubbele waarden op te slaan in een kolom met een unieke index. |
INVALID_CURSOR | 01001 | -1001 | Het wordt weergegeven wanneer pogingen worden gedaan om een cursorbewerking uit te voeren die niet is toegestaan, zoals het sluiten van een ongeopende cursor. |
INVALID_NUMBER | 01722 | -1722 | Het wordt gegenereerd wanneer de conversie van een tekenreeks naar een getal mislukt omdat de tekenreeks geen geldig nummer vertegenwoordigt. |
LOGIN_DENIED | 01017 | -1017 | Het wordt weergegeven wanneer een programma probeert in te loggen op de database met een ongeldige gebruikersnaam of ongeldig wachtwoord. |
NO_DATA_FOUND | 01403 | +100 | Het wordt verhoogd wanneer een SELECT INTO-instructie geen rijen retourneert. |
NOT_LOGGED_ON | 01012 | -1012 | Het wordt weergegeven wanneer een database-aanroep wordt gedaan zonder verbinding met de database. |
PROGRAM_ERROR | 06501 | -6501 | Het wordt gemeld wanneer PL/SQL een intern probleem heeft. |
ROWTYPE_MISMATCH | 06504 | -6504 | Het wordt verhoogd wanneer een cursor een waarde ophaalt in een variabele met een incompatibel datatype. |
SELF_IS_NULL | 30625 | -30625 | Het wordt gegenereerd wanneer een lidmethode wordt aangeroepen, maar de instantie van het objecttype niet is geïnitialiseerd. |
STORAGE_ERROR | 06500 | -6500 | Het wordt gegenereerd wanneer PL/SQL geen geheugen meer heeft of het geheugen beschadigd is. |
TOO_MANY_ROWS | 01422 | -1422 | Het wordt verhoogd wanneer een SELECT INTO-instructie meer dan één rij retourneert. |
VALUE_ERROR | 06502 | -6502 | Het wordt gegenereerd wanneer er een rekenkundige, conversie-, truncatie- of groottebeperkingsfout optreedt. |
ZERO_DIVIDE | 01476 | 1476 | Het wordt verhoogd wanneer een poging wordt gedaan om een getal door nul te delen. |
Voorbeeld
CREATE OR REPLACE PROCEDURE add_new_student (student _id_in IN NUMBER, student _name_in IN VARCHAR2) IS BEGIN INSERT INTO student (student _id, student _name ) VALUES ( student _id_in, student _name_in ); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN raise_application_error (-20001,'Duplicate student _id'); WHEN OTHERS THEN raise_application_error (-20002,'An error occurred.'); END;
Verderop in dit artikel over het afhandelen van uitzonderingen in PL/SQL, laten we eens kijken wat naamloze systeemuitzonderingen zijn.
Niet nader genoemde systeemuitzonderingen
De systeemuitzonderingen waarvoor Oracle geen naam heeft, staan bekend als naamloze systeemuitzonderingen. Deze uitzonderingen komen niet vaak voor en zijn geschreven met een code en een bijbehorend bericht.
Er zijn in principe twee manieren om naamloze systeemuitzonderingen af te handelen:
1. De uitzonderingshandler WHEN OTHERS gebruiken
2. De uitzonderingscode aan een naam koppelen en deze gebruiken als een benoemde uitzondering.
Enkele stappen die worden gevolgd voor naamloze systeemuitzonderingen zijn:
- Verhoog ze impliciet.
- Als ze niet worden behandeld 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 naamloze 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 uitzonderingen begrijpen.
Door gebruiker gedefinieerd
Net als alle andere programmeertalen, staat Oracle u ook toe om uw eigen uitzonderingen te declareren voor advertentie-implementaties. 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 een variabele van het gegevenstype EXCEPTION in onze code te declareren en deze expliciet in ons programma te verhogen met behulp van de RAISE-instructie.
- De functie PRAGMA EXCEPTION_INIT gebruiken
We kunnen een niet-vooraf gedefinieerd foutnummer definiëren met de variabele van het gegevenstype UITZONDERING
- Met de methode RAISE_APPLICATION_ERROR
Met deze methode kunnen we een door de gebruiker gedefinieerde uitzondering declareren met ons eigen aangepaste foutnummer en bericht.
Tot nu toe had je misschien een idee van de manieren waarop we door de gebruiker gedefinieerde uitzonderingen in PL/SQL kunnen verhogen. We zullen meer leren over elk van de bovengenoemde methoden met voorbeelden verderop in dit artikel over het afhandelen van uitzonderingen in PL/SQL.
Laten we in dit artikel verder gaan met de demonstraties van door de gebruiker gedefinieerde uitzonderingsbehandeling.
Demonstratie van door de gebruiker gedefinieerde uitzonderingen
Verderop in dit artikel over het afhandelen van uitzonderingen in PL/SQL, laten we eens kijken hoe we de variabele van het type UITZONDERING kunnen gebruiken.
Variabele van het type UITZONDERING gebruiken
Het proces van het declareren van een door de gebruiker gedefinieerde uitzondering is verdeeld in drie delen en deze 3 delen zijn:
- Declareer een variabele uitzonderingsgegevenstype
- 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 EXCEPTION
In het bovenstaande declaratieblok hebben we vier variabelen, waaronder de eerste drie variabelen van het gegevenstype met een normaal getal en de vierde, ex_DivZero, is de speciale uitzonderingsgegevenstypevariabele. De vierde is onze door de gebruiker gedefinieerde uitzondering.
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
Het bovenstaande uitvoeringsgedeelte van dit anonieme blok komt alleen in actie als de deler 0 is. Als de deler nul is, zoals in ons geval, wordt de fout gegenereerd en de besturing van het programma slaat alle volgende stappen over en zoekt naar een overeenkomende uitzonderingsbehandelaar. In het geval dat het een ander 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.
EXCEPTION WHEN ex_DivZero THEN DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);
Dit is de uitzonderingshandler. Zodra de gebruiker de deler als 0 invoert, wordt de bovenstaande berichtreeks gevraagd.
Definitieve code:
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION BEGIN IF var_divisor =0 THEN RAISE ex-DivZero; END IF; Var_result := var_dividend/var_divisor; DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result); BEGIN IF var_divisor =0 THEN RAISE ex-DivZero; END IF; Var_result := var_dividend/var_divisor; DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result); END;
We gaan verder in dit artikel over het afhandelen van uitzonderingen in PL/SQL en laten ons begrijpen hoe we de PRAGMA_EXCEPTION_INIT-methode kunnen gebruiken.
De functie PRAGMA EXCEPTION_INIT gebruiken
In de PRAGMA EXCEPTION_INIT-functie wordt een uitzonderingsnaam gekoppeld aan 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(exception_name, -Oracle_error_number);
Voorbeeld
DECLARE deadlock_detected EXCEPTION; PRAGMA EXCEPTION_INIT(deadlock_detected, -60); BEGIN NULL; -- Some operation that causes an ORA-00060 error EXCEPTION WHEN deadlock_detected THEN NULL; -- handle the error END;
De PRAGMA EXCEPTION_INIT vertelt de compiler om een uitzonderingsnaam te associëren met een Oracle-foutnummer, zoals eerder vermeld. Hiermee kunt u naar elke interne uitzondering bij naam verwijzen en er een specifieke handler voor schrijven. Als je een stapel fouten of een reeks foutmeldingen ziet, is de stapel bovenaan de stapel die kan worden opgevangen en afgehandeld.
We gaan verder in dit artikel over het afhandelen van uitzonderingen in PL/SQL en laten ons begrijpen hoe we de RAISE_APPLICATION_ERROR-methode kunnen gebruiken.
Met de methode RAISE_APPLICATION_ERROR
Het is een procedure die is ingebouwd in de Oracle-software. Met behulp van deze procedure kunnen we een foutnummer koppelen aan een aangepaste foutmelding. 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 een fout wordt aangetroffen. RAISE_APPLICATION_ERROR procedure is te vinden in DBMS_STANDARD pakket
Syntaxis
raise_application_error (error_number, message [, {TRUE | FALSE}]);
Voorbeeld
/* A trigger trg_emp_detail_chk is created.*/ CREATE OR REPLACE TRIGGER trg_emp_detail_chk /* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/ Before UPDATE ON employees DECLARE permission_denied EXCEPTION; BEGIN /*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/ IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!'); /* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter with a default text stating that the user is not authorized to do any modification in the weekends. */ END IF; END;
Hiermee komen we aan het einde van dit artikel over “Afhandeling van uitzonderingen in PL/SQL”. Ik hoop dat dit onderwerp goed wordt begrepen en je geholpen heeft. Probeer uw eigen codes te schrijven en gebruik de methoden die in dit artikel worden uitgelegd.
Als je getraind wilt worden door professionals over deze technologie, kun je kiezen voor een gestructureerde training van edureka! Bekijk deze MySQL DBA-certificeringstraining van Edureka, een vertrouwd online leerbedrijf met een netwerk van meer dan 250.000 tevreden studenten verspreid over de hele wereld. Deze cursus leidt u op 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 bent u in staat om uw eigen MySQL Database te creëren en te beheren en te beheren gegevens.
Heeft u een vraag voor ons? Vermeld dit in het opmerkingengedeelte van dit artikel "Afhandeling van uitzonderingen in PL/SQL" en we nemen zo snel mogelijk contact met u op.