sql >> Database >  >> RDS >> Database

Leer hoe u omgaat met uitzonderingen in PL/SQL

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

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&nbsp; 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.


  1. Hoe reset ik een reeks in Oracle?

  2. SQL Server 2012 Service Pack 1 &Cumulatieve Update 1

  3. GUI-tool voor PostgreSQL

  4. Waarom rondt SQL Server de resultaten af ​​van het delen van twee gehele getallen?