sql >> Databasteknik >  >> RDS >> Database

Lär dig hur du hanterar undantag i PL/SQL

Om du är en programmerare kanske du är bekant med konceptet med undantagshantering är en integrerad del av alla programmeringsspråk. Eftersom fel är oundvikliga och även de smartaste av oss kan göra fel när vi skriver kod, måste vi vara bekanta med hur vi ska hantera dem. I den här artikeln kommer vi att lära oss särskilt om undantagshanteringen i PL/SQL.

Nedan är de ämnen som tas upp i den här artikeln:

  • Vad är ett undantag?
  • Syntax för undantagshantering
  • Typer av undantag
    • Systemdefinierat
      • Namngivna systemundantag
      • Onamngivna systemundantag
    • Användardefinierad
      • Steg för att deklarera användardefinierade funktioner
      • Exempel på användardefinierade funktioner

Vad är ett undantag?

Alla onormala tillstånd eller händelser som avbryter det normala flödet av våra programinstruktioner vid körning eller i enkla ord ett undantag är ett fel.

Syntax för undantagshantering i 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;

Här kan vi lista så många undantag som vi vill hantera. Standardundantaget kommer att hanteras med "NÄR andra DÅ"

Exempel på undantagshantering i PL/SQL

Nedanstående program visar namn och adress till en student vars ID har angivits. Eftersom det inte finns någon elev med ID-värde 8 i vår databas, tar programmet upp körtidsundantaget NO_DATA_FOUND, som fångas i EXCEPTION-blocket.

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; 

Utdata

No such student!
PL/SQL procedure successfully completed.  

Här kan vi lista så många undantag som vi vill hantera. Standardundantaget kommer att hanteras med "NÄR andra DÅ

Typer av undantag i PL/SQL

  • Systemdefinierat
  • Användare trotsade

Låt oss härnäst i den här artikeln om undantagshantering i PL/SQL diskutera båda dessa typer i detalj.

Systemdefinierat

Definierade och underhålls implicit av Oracle-servern, dessa undantag definieras huvudsakligen i Oracle Standard Package. Närhelst ett undantag inträffar i programmet, matchar Oracle-servern och identifierar lämpligt undantag från den tillgängliga uppsättningen av undantag som finns i Oracles standardpaket. I grund och botten är dessa undantag fördefinierade i PL/SQL som höjs NÄR en viss databasregel överträds .

De Systemdefinierade undantagen är vidare indelade i två kategorier:

  • Namngivna systemundantag
  • Onamngivna systemundantag

Namngivna systemundantag

De namngivna PL/SQL-undantagen är namngivna i standardpaketet för PL/SQL , därför behöver utvecklaren inte definiera PL/SQL-undantagen i sin kod. PL/SQL tillhandahåller många fördefinierade namngivna undantag, som exekveras när någon databasregel överträds av ett program. Följande tabell listar några av de viktiga fördefinierade undantagen −

Undantag Oracle-fel SQLCODE Beskrivning
ACCESS_INTO_NULL 06530 -6530 Det höjs när ett null-objekt automatiskt tilldelas ett värde.
CASE_NOT_FOUND 06592 -6592 Det höjs när inget av alternativen i WHEN-satsen i en CASE-sats är vald, och det inte finns någon ELSE-sats.
COLLECTION_IS_NULL 06531 -6531 Den höjs när ett program försöker tillämpa andra insamlingsmetoder än EXISTS på en oinitierad kapslad tabell eller varray, eller programmet försöker tilldela värden till elementen i en oinitierad kapslad tabell eller varray.
DUP_VAL_ON_INDEX 00001 -1 Den höjs när dubbletter av värden försöker lagras i en kolumn med ett unikt index.
INVALID_CURSOR 01001 -1001 Den höjs när försök görs att göra en marköroperation som inte är tillåten, som att stänga en oöppnad markör.
INVALID_NUMBER 01722 -1722 Den höjs när omvandlingen av en teckensträng till ett tal misslyckas eftersom strängen inte representerar ett giltigt tal.
LOGIN_DENIED 01017 -1017 Det uppstår när ett program försöker logga in på databasen med ett ogiltigt användarnamn eller lösenord.
NO_DATA_FOUND 01403 +100 Den höjs när en SELECT INTO-sats inte returnerar några rader.
NOT_LOGGED_ON 01012 -1012 Det uppstår när ett databasanrop utfärdas utan att vara anslutet till databasen.
PROGRAM_ERROR 06501 -6501 Det höjs när PL/SQL har ett internt problem.
ROWTYPE_MISMATCH 06504 -6504 Den höjs när en markör hämtar värde i en variabel med inkompatibel datatyp.
SELF_IS_NULL 30625 -30625 Den höjs när en medlemsmetod anropas, men instansen av objekttypen initierades inte.
STORAGE_ERROR 06500 -6500 Den höjs när PL/SQL fick slut på minne eller minnet var skadat.
TOO_MANY_ROWS 01422 -1422 Den höjs när en SELECT INTO-sats returnerar mer än en rad.
VALUE_ERROR 06502 -6502 Det höjs när ett aritmetik-, konverterings-, trunkerings- eller storleksbegränsningsfel inträffar.
ZERO_DIVIDE 01476 1476 Den höjs när ett försök görs att dividera ett tal med noll.

Exempel

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;

Om vi ​​går vidare i den här artikeln om undantagshantering i PL/SQL, låt oss förstå vad som är namnlösa systemundantag.

Onamngivna systemundantag

Systemundantagen för vilka Oracle inte har ett namn är kända som namnlösa systemundantag. Dessa undantag förekommer inte ofta och skrivs med en kod och ett tillhörande meddelande.

Det finns i princip två sätt att hantera icke namngivna systemundantag:

1. Använda undantagshanteraren WHEN OTHERS

2. Koppla undantagskoden till ett namn och använda den som ett namngivet undantag.

Några steg som följs för icke namngivna systemundantag är:

  • Höj dem implicit.
  • Om de inte hanteras i "NÄR andra" måste de hanteras explicit.
  • För att hantera undantaget explicit kan de deklareras med Pragma EXCEPTION_INIT och hanteras genom att referera till det användardefinierade undantagsnamnet i undantagsavsnittet.

Ett exempel på hantering av icke namngivna undantag med Pragma EXCEPTION_INIT ges längre fram i artikeln. Gå vidare i den här artikeln om undantagshantering i PL/SQL, låt oss förstå de användardefinierade undantagen.

Användardefinierad

Precis som alla andra programmeringsspråk tillåter Oracle dig också att deklarera annonsimplementering av dina egna undantag. Till skillnad från systemdefinierade undantag tas dessa undantag upp explicit i PL/SQL-blocket.

Steg för att deklarera användardefinierade undantag i Oracle-databasen

Vi kan definiera användardefinierade undantag i Oracle-databasen på följande tre sätt:

  • Använder variabel av typen EXCEPTION

Här kan vi deklarera ett användardefinierat undantag genom att deklarera en variabel av datatypen EXCEPTION i vår kod och höja den explicit i vårt program med RAISE-satsen.

  • Använder PRAGMA EXCEPTION_INIT-funktionen

Vi kan definiera ett icke-fördefinierat felnummer med variabeln EXCEPTION datatype

  • Med metoden RAISE_APPLICATION_ERROR

Med den här metoden kan vi deklarera ett användardefinierat undantag med vårt eget anpassade felnummer och meddelande.

Tills nu har du kanske fått en grov uppfattning om hur vi kan ta upp användardefinierade undantag i PL/SQL. Vi kommer att lära oss om var och en av de ovan nämnda metoderna med exempel längre fram i den här artikeln om undantagshantering i PL/SQL.

Låt oss härnäst i den här artikeln fortsätta med demonstrationerna av användardefinierad hantering av undantag.

Demonstration av användardefinierade undantag

Gå vidare i den här artikeln om undantagshantering i PL/SQL, låt oss förstå hur man använder variabeln av typen EXCEPTION.

Använda variabel av typen EXCEPTION

Processen att deklarera användardefinierat undantag är uppdelad i tre delar och dessa tre delar är:

  • Deklarera en datatyp för variabel undantag
  • Höj undantaget
  • Hantera undantaget

Låt oss skriva en kod för att visa stegen ovan i detalj.

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

I ovanstående deklarationsblock har vi fyra variabler, bland vilka de tre första är normala datatypvariabler och den fjärde som är ex_DivZero är den speciella undantagsdatatypvariabeln. Det fjärde är vårt användardefinierade undantag.

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

Ovanstående exekveringsdel av detta anonyma block kommer att träda i kraft först när divisorn är 0. Om divisorn är noll som den är i vårt fall kommer felet att ökas och kontrollen av programmet kommer att hoppa över alla nästa steg och letar efter matchande undantagshanterare. Om den hittar någon annan kommer den att utföra åtgärden i enlighet med detta, annars kommer den antingen att avsluta programmet eller uppmana oss med ett ohanterat systemdefinierat fel.

EXCEPTION WHEN ex_DivZero THEN
DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);

Detta är undantagshanteraren. Så snart användaren anger divisor som 0, kommer meddelandesträngen ovan att uppmanas.

Slutlig kod:

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;

Om vi ​​går vidare i den här artikeln om undantagshantering i PL/SQL, låt oss förstå hur man använder metoden PRAGMA_EXCEPTION_INIT.

Använder PRAGMA EXCEPTION_INIT-funktionen

I PRAGMA EXCEPTION_INIT-funktionen är ett undantagsnamn associerat med ett Oracle-felnummer. Detta namn kan användas för att utforma undantagshanteraren för felet. För stora projekt med många användardefinierade fel är PRAGMA EXCEPTION_INIT den mest användbara och lämpliga metoden.

Syntax:

PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);

Exempel

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;

PRAGMA EXCEPTION_INIT säger åt kompilatorn att associera ett undantagsnamn med ett Oracle-felnummer som tidigare nämnts. Det låter dig referera till alla interna undantag med namn och skriva en specifik hanterare för det. När du ser en felstapel, eller sekvens av felmeddelanden, är den överst den som kan fångas och hanteras.

Om vi ​​går vidare i den här artikeln om undantagshantering i PL/SQL, låt oss förstå hur man använder metoden RAISE_APPLICATION_ERROR.

Med metoden RAISE_APPLICATION_ERROR

Det är en procedur som är inbyggd i Oracle-programvaran. Med den här proceduren kan vi associera ett felnummer med ett anpassat felmeddelande. Genom att kombinera både felnumret och det anpassade felmeddelandet kan en felsträng skapas som liknar de standardfelsträngar som visas av Oracle när ett fel påträffas. RAISE_APPLICATION_ERROR-proceduren finns i DBMS_STANDARD-paketet

Syntax

raise_application_error (error_number, message [, {TRUE | FALSE}]);

Exempel

/* 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;

Med detta kommer vi till slutet av denna artikel om "Undantagshantering i PL/SQL". Jag hoppas att detta ämne förstås väl och att det har hjälpt dig. Försök att skriva dina egna koder och införliva metoderna som förklaras i den här artikeln.

Om du vill bli utbildad av proffs i denna teknik kan du välja strukturerad utbildning från edureka! Kolla in denna MySQL DBA-certifieringsutbildning av Edureka, ett pålitligt onlineutbildningsföretag med ett nätverk av mer än 250 000 nöjda elever spridda över hela världen. Den här kursen utbildar dig i kärnkoncepten och avancerade verktyg och tekniker för att hantera data och administrera MySQL-databasen. Det inkluderar praktisk inlärning av begrepp som MySQL Workbench, MySQL Server, Datamodellering, MySQL Connector, Databas Design, MySQL Command line, MySQL Functions etc. I slutet av utbildningen kommer du att kunna skapa och administrera din egen MySQL Database och hantera data.

Har du en fråga till oss? Vänligen nämn det i kommentarsfältet i den här artikeln "Undantagshantering i PL/SQL" så återkommer vi till dig så snart som möjligt.


  1. 4 sätt att få SQL Server-jobbhistorik

  2. Subtrahera år från ett datum i PostgreSQL

  3. Hantera primärnyckelkonflikter vid infogning av data i SQLite

  4. Hur man exporterar frågeresultat till en CSV-fil i SQL Developer (Oracle)