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
- Systemdefinierat
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 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.