complete guide pl sql exception handling with examples
Denna handledning förklarar PL SQL Exception Handling och relaterade begrepp som typer av undantag, användardefinierade och systemdefinierade undantag, hur man tar upp ett undantag, etc:
I PL / SQL-datatidsformat av PL / SQL-serien , vi lärde oss om några användbara funktioner kring Datetime, Timestamp och Interval
I den här artikeln kommer vi att diskutera undantagshantering i PL SQL. Vi ska också undersöka fördelarna med undantag och hur man kan höja dem.
Låt oss börja med lärorna !!
Vad du kommer att lära dig:
PL SQL Undantagshantering
Ett fel eller en varningshändelse kallas ett undantag. Det påträffas under körningstiden för PL / SQL-programmet. PL / SQL har mekanismer för att hantera dessa exceptionella förhållanden med hjälp av EXCEPTION-kodkod där det definieras hur man ska motverka felförhållandet.
Det finns två typer av undantag. De listas nedan:
- Användardefinierade undantag.
- Systemdefinierade undantag.
Några av de populära systemdefinierade undantagen är slut på minne och dividera med noll, med namn som STORAGE_ERROR respektive ZERO_DIVIDE. Användardefinierade undantag deklareras i ett paket, underprogram eller i deklarationsavsnittet i PL / SQL-kodblocket och bör tilldelas namn.
När ett undantag inträffar stoppas det naturliga körningsflödet och körningen pekar sedan på undantagsavsnittet i PL / SQL-koden. Medan de systemdefinierade undantagen kastas som standard, måste de användardefinierade undvikas uttryckligen av RAISE-nyckelordet.
Undantagshanteringen hjälper alltså till att hantera de fel som påträffas under körningstiden och inte under kompilering av programmet.
Fördelar med undantagshantering
Fördelarna listas nedan:
- Om vår kod inte har en undantagshantering måste vi verifiera fel vid körning varje gång vi utför ett uttalande.
- Om vi undviker hantering av undantag i vår kod, missas de faktiska felen vilket ger upphov till några andra fel.
- Undantagshanteringen gör det möjligt att hoppa över flera verifieringar i koden.
- Det ger bättre läsbarhet för koden genom att isolera felhanterarna i koden.
Syntax för hantering av undantag:
DECLARE <> BEGIN < > EXCEPTION <> WHEN excp1 THEN <> WHEN excp2 THEN <> ........ WHEN others THEN <> END;
Standardundantaget utförs med NÄR andra SÅ.
Låt oss överväga en tabell som heter MEDBORGARE .
SELECT * FROM CITIZEN;
Vi har skapat CITIZEN-tabellen med hjälp av SQL-uttalandet nedan.
CREATE TABLE CITIZEN ( ID INT NOT NULL, NAME VARCHAR (15) NOT NULL, AGE INT NOT NULL, PRIMARY KEY (ID) );
Infoga värden i den här tabellen med SQL-uttalanden nedan:
INSERT INTO CITIZEN VALUES (1, 'ZAKS', 14); INSERT INTO CITIZEN VALUES (8, 'RANNY', 75); INSERT INTO CITIZEN VALUES (5, 'TOM', 37);
Kodning Implementering med undantagshantering:
DECLARE citizen_id citizen.id%type; citizen_name citizen.name%type; citizen_age citizen.age%type := 9; BEGIN SELECT id, name INTO citizen_id, citizen_name FROM citizen WHERE age = citizen_age; DBMS_OUTPUT.PUT_LINE ('Citizen id is: '|| citizen_id); DBMS_OUTPUT.PUT_LINE ('Citizen name is: '|| citizen_name); EXCEPTION WHEN no_data_found THEN dbms_output.put_line ('No citizen detail found'); WHEN others THEN dbms_output.put_line ('Errors'); END; /
Utgången från ovanstående kod:
I ovanstående kod, eftersom det inte finns några medborgare med 9 års ålder i CITIZEN-tabellen, tas ett runtime-undantag upp.
Öka undantaget i PL / SQL
Ett undantag kan tas upp av utvecklarna uttryckligen med hjälp av nyckelordet RAISE.
Syntaksen för undantagshöjning:
DECLARE exception_n EXCEPTION; BEGIN IF condition THEN RAISE exception_n; END IF; EXCEPTION WHEN exception_n THEN <>; END;
Här är undantaget_n namnet på det undantag som vi tar upp. På detta sätt kan vi höja både användardefinierade och systemdefinierade undantag.
Användardefinierat undantag
Utvecklarna kan bygga sina egna undantag och använda dem för hanteringsfel. De kan skapas i deklarationsdelen av ett underprogram och kan endast nås i det underprogrammet.
Ett undantag som skapas på paketnivå kan användas när paketet nås. Ett användardefinierat undantag kan höjas med hjälp av RAISE-nyckelordet.
Syntaxen för ett användardefinierat fel är:
DECLARE exception_n EXCEPTION;
Här, den undantag_n är namnet på det undantag som vi tar upp. Således kan vi förklara ett undantag genom att ge ett namn följt av EXCEPTION-nyckelordet. Ett undantag kan deklareras på liknande sätt som variabler deklareras. Ett undantag är dock ett oväntat tillstånd och inte ett dataobjekt.
Undantagsomfattning i PL / SQL:
Reglerna för omfattning för PL / SQL-undantag listas nedan:
- Ett undantag kan inte deklareras mer än en gång i samma kodblock. Men vi kan förklara samma undantag i två olika kodblock.
- Ett undantag som deklarerats i ett kodblock är lokalt inom det blocket och globalt för varje delblock.
- Om vi återigen förklarar ett globalt undantag i ett underblock, åsidosätter den lokala deklarationen.
Låt oss återigen överväga en tabell som heter CITIZEN.
Kodimplementering med användardefinierade undantag:
DECLARE firstexception EXCEPTION; j NUMBER; BEGIN FOR j IN (SELECT * FROM CITIZEN) LOOP IF j.ID = 8 THEN RAISE firstexception; END IF; END LOOP; EXCEPTION WHEN firstexception THEN dbms_output.put_line ('Citizen with ID 8 already exist in table.'); END; /
Utgången från ovanstående kod:
Fördefinierat undantag
I strid med databasreglerna eller överskrider systemberoende tröskel kastas ett internt undantag automatiskt. Alla dessa fel har ett unikt nummer och varje undantag definieras som ett namn. Till exempel, PL / SQL kastar NO_DATA_FOUND fördefinierat undantag när en SELECT-fråga inte hämtar några rader.
Alla fördefinierade undantag från PL / SQL deklareras i STANDARD-paketet som handlar om PL / SQL-miljön.
Undantag | Oracle-fel | SQL-KOD | Beskrivning |
---|---|---|---|
OGILTIGT NUMMER | TID - 01722 | -1722 | Detta undantag tas upp om konverteringen till en teckensträng till ett nummer inte passerar eftersom strängen representerar ett ogiltigt nummer. |
ACCESS_INTO_NULL | NU - 06530 | -6530 | Detta undantag tas upp om ett null-objekt naturligt tilldelas ett värde. |
CASE_NOT_FOUND | NU - 06592 | -6592 | Detta undantag tas upp om inget av alternativen i WHEN-klausulen väljs och det inte finns någon ELSE-klausul. |
COLLECTION_IS_NULL | NU - 06531 | -6531 | Detta undantag tas upp när koden försöker tillämpa insamlingsmetoder utom EXISTS i en kapslad tabell eller varray som inte initialiseras. Det kan också höjas om vår kod försöker tilldela värden till en kapslad tabell eller varray som inte initialiseras. |
DUP_VAL_ON_INDEX | TID - 00001 | -1 | Detta undantag höjs om dubbla värden försöks lagras i en kolumn som är begränsad av ett unikt index. |
CURSOR_ALREADY_OPEN | NU - 06511 | -6511 | Detta undantag tas upp om vår kod försöker öppna en redan öppen markör. |
INVALID_CURSOR | TID - 01001 | -1001 | Detta undantag tas upp om vi försöker göra vissa operationer på markörer som inte är tillåtna. Till exempel försöker du stänga en redan stängd markör. |
LOGIN_DENIED | TID - 01017 | -1017 | Detta undantag tas upp om programmet försökte logga in på databasen med ett felaktigt användarnamn och lösenord. |
INGEN INFORMATION HITTAD | TID - 01403 | 100 | Detta undantag tas upp om en SELECT-fråga inte hämtar några rader. |
NOT_LOGGED_ON | TID - 01012 | -1012 | Detta undantag tas upp om vi försöker göra en databasåtgärd utan att ansluta till den. |
PROGRAM_ERROR | TID - 06501 | -6501 | Detta undantag tas upp om PL / SQL-programmet har stött på ett internt fel. |
ROWTYPE_MISMATCH | TID - 06504 | -6504 | Detta undantag tas upp om en markör försöker återföra värden till en variabel med inkompatibel datatyp. |
SELF_IS_NULL | NU - 30625 | -30625 | Detta undantag tas upp om en medlemsmetod anropas utan att dess objekttyp initialiseras. |
STORAGE_ERROR | NU - 06500 | -6500 | Detta undantag tas upp om PL / SQL-programmet slut på minne eller dess minne skadades under körning. |
TOO_MANY_ROWS | TID - 01422 | -1422 | Detta undantag tas upp om en SELECT-fråga hämtar flera rader. |
SUBSCRIPT_BEYOND_COUNT | NU - 06533 | -6533 | Detta undantag tas upp om ett prenumeration är mer än det totala antalet av element i samlingen. |
PRENUMERERA OUTSIDE_LIMIT | NU - 06532 | -6532 | Detta undantag höjs om ett prenumeration ligger utanför tröskelvärdet. |
SYS_INVALID_ROWID | ORA-01410 | -1410 | Detta undantag tas upp om konverteringen till en teckensträng till ett universellt rad-id inte passerar eftersom teckensträngen representerar ett ogiltigt rad-id. |
TIMEOUT_ON_RESOURCE | ORA-00051 | -51 | Detta undantag tas upp om Oracle väntar på en resurs. |
VALUE_ERROR | ORA-06502 | -6502 | Detta undantag tas upp om ett matematiskt, konverterings-, trunkeringsfel inträffar i vårt program. |
ZERO_DIVIDE | ORA-01476 | -1476 | Detta undantag tas upp om vi försöker dela ett tal med 0. |
Vanliga frågor och svar
F # 1) Vad är ett fördefinierat undantag i PL / SQL?
Svar: Ett fördefinierat undantag kastas automatiskt av PL / SQL om ett program bryter mot reglerna i databasen.
F # 2) Vad hanterar PL / SQL-undantag och varför behövs det?
Svar: Ett fel eller en oväntad händelse i programmet kallas ett undantag. Det stoppar det normala genomförandet av programmet. I PL / SQL hanteras undantaget i ett EXCEPTION-block i koden och korrekt åtgärd mot undantaget beskrivs inuti det blocket.
F # 3) Vad menas med undantagshantering?
Svar: Det är metoden för att svara på oväntade händelser som kan inträffa när koden körs.
F # 4) Vilka är de två formerna av felhantering?
Svar: De två formerna av felhantering inkluderar kompileringsfel och körtidsfel . Körtidsfelet inträffar under körningen av programmet på grund av felaktig data eller logik. Kompileringsfelen fångas under sammanställningen av vår kod.
F # 5) Vad är skillnaden mellan fel och undantag?
Svar: Undantag är incidenter som hanteras med hjälp av try / catch block och kan påträffas både i sammanställningstiden och körtiden för programkörningen. Felen uppträder däremot endast under körningstiden.
Slutsats
I denna handledning har vi i detalj diskuterat några grundläggande begrepp för PL / SQL som är viktiga för att hantera undantagen i våra program.
Vi har täckt följande ämnen som listas nedan:
de primära filåtkomsträttigheterna i unix är:
- Undantag.
- Typer av undantag.
- Några fördefinierade undantag.
I nästa handledning ska vi diskutera PL / SQL-transaktioner, OOPS-koncept och många fler anslutna ämnen.
Rekommenderad läsning
- C # Handledning för undantagshantering med kodexempel
- Java-undantag och undantagshantering med exempel
- PL SQL-paket: Oracle PL / SQL-pakethandledning med exempel
- Undantagshantering i C ++
- PL SQL-handledning för nybörjare med exempel | Vad är PL / SQL
- PL SQL Records handledning med exempel