Vad är undantagshantering i PL / SQL?
Ett undantag inträffar när PL / SQL-motorn stöter på en instruktion som den inte kan utföra på grund av ett fel som uppstår vid körning. Dessa fel kommer inte att fångas vid tidpunkten för sammanställningen och därför behövs dessa endast för att hanteras vid körningstiden.
Till exempel, om PL / SQL-motorn får en instruktion om att dela ett nummer med '0', kommer PL / SQL-motorn att kasta det som ett undantag. Undantaget tas endast upp under körning av PL / SQL-motorn.
Undantag kommer att hindra programmet från att köras vidare, så för att undvika sådana villkor måste de fångas och hanteras separat. Denna process kallas Exception-Handling, där programmeraren hanterar det undantag som kan inträffa under körningstiden.
I den här handledningen lär du dig följande ämnen-
- Syntax för undantagshantering
- Typer av undantag
- Fördefinierade undantag
- Användardefinierat undantag
- PL / SQL Raise Undantag
- Viktiga punkter att notera i Undantag
Syntax för undantagshantering
Undantag hanteras på blocket, nivå, det vill säga en gång om något undantag inträffar i något block kommer kontrollen att komma ur exekveringsdelen av det blocket. Undantaget kommer då att hanteras i undantagshanteringsdelen av det blocket. Efter hanteringen av undantaget är det inte möjligt att skicka tillbaka kontrollen till exekveringsavsnittet för det blocket.
Nedanstående syntax förklarar hur man kan fånga och hantera undantaget.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Syntaxförklaring:
- I ovanstående syntax innehåller blocket för undantagshantering serier av WHEN-tillstånd för att hantera undantaget.
- Varje WHEN-tillstånd följs av undantagsnamnet som förväntas höjas vid körtiden.
- När något undantag tas upp vid körning kommer PL / SQL-motorn att leta efter undantaget i undantagshanteringsdelen. Det kommer att börja från den första "NÄR" -satsen och sekventiellt kommer den att söka.
- Om den hittade undantagshanteringen för det undantag som har höjts kommer den att exekvera den specifika hanteringskoddelen.
- Om ingen av 'WHEN'-klausulen finns för det undantag som har höjts, kommer PL / SQL-motorn att utföra delen' WHEN OTHERS '(om den finns). Detta är vanligt för alla undantag.
- Efter att undantaget har utförts kommer delkontrollen att gå ut ur det aktuella blocket.
- Endast en undantagsdel kan köras för ett block vid körning. Efter att ha kört den kommer styrenheten att hoppa över den återstående undantagshanteringsdelen och kommer att gå ut ur det aktuella blocket.
Obs: NÄR ANDRA ska alltid vara i den sista positionen i sekvensen. Den undantagshanteringsdel som finns efter WHEN ANDRA kommer aldrig att köras eftersom kontrollen kommer att lämna blocket efter att WHEN ANDRA har körts.
Typer av undantag
Det finns två typer av undantag i Pl / SQL.
- Fördefinierade undantag
- Användardefinierat undantag
Fördefinierade undantag
Oracle har fördefinierat något vanligt undantag. Dessa undantag har ett unikt undantagsnamn och felnummer. Dessa undantag har redan definierats i "STANDARD" -paketet i Oracle. I kod kan vi använda dessa fördefinierade undantagsnamn direkt för att hantera dem.
Nedan följer några få fördefinierade undantag
Undantag | Felkod | Undantag Anledning |
ACCESS_INTO_NULL | ORA-06530 | Tilldela ett värde till attributen för oinitialiserade objekt |
CASE_NOT_FOUND | ORA-06592 | Ingen av "WHEN" -klausulen i CASE-uttalandet är uppfyllt och ingen "ELSE" -klausul anges |
COLLECTION_IS_NULL | ORA-06531 | Använda insamlingsmetoder (förutom EXISTS) eller åtkomst till samlingsattribut i en oinitialiserad samling |
CURSOR_ALREADY_OPEN | ORA-06511 | Försöker öppna en markör som redan är öppnad |
DUP_VAL_ON_INDEX | ORA-00001 | Lagring av ett dubblettvärde i en databaskolumn som begränsas av unikt index |
INVALID_CURSOR | ORA-01001 | Olagliga marköråtgärder som att stänga en oöppnad markör |
OGILTIGT NUMMER | ORA-01722 | Konvertering av tecken till ett nummer misslyckades på grund av ogiltigt numretecken |
INGEN INFORMATION HITTAD | ORA-01403 | När 'VÄLJ' -uttryck som innehåller INTO-sats hämtar inga rader. |
ROW_MISMATCH | ORA-06504 | När typ av markörvariabel är oförenlig med den aktuella typen av markörretur |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Hänvisar insamling med ett indexnummer som är större än samlingsstorleken |
PRENUMERERA OUTSIDE_LIMIT | ORA-06532 | Hänvisning till insamling med ett indexnummer som ligger utanför det lagliga intervallet (t.ex. -1) |
TOO_MANY_ROWS | ORA-01422 | När ett SELECT-uttalande med INTO-satsen returnerar mer än en rad |
VALUE_ERROR | ORA-06502 | Aritmetik- eller storleksbegränsningsfel (t.ex.: tilldela ett värde till en variabel som är större än den variabla storleken) |
ZERO_DIVIDE | ORA-01476 | Dela ett tal med '0' |
Användardefinierat undantag
I Oracle, utom de ovan fördefinierade undantagen, kan programmeraren skapa sitt eget undantag och hantera dem. De kan skapas på underprogramnivå i deklarationsdelen. Dessa undantag är endast synliga i det underprogrammet. Undantaget som definieras i paketspecifikationen är offentligt undantag och det är synligt varhelst paketet är tillgängligt. <
Syntax: På underprogramnivå
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- I ovanstående syntax definieras variabeln "exception_name" som "EXCEPTION" -typ.
- Detta kan användas på ett liknande sätt som ett fördefinierat undantag.
Syntax: På paketets specifikationsnivå
CREATE PACKAGEIS EXCEPTION;… END ;
- I ovanstående syntax definieras variabeln "exception_name" som "EXCEPTION" -typ i paketspecifikationen för
. - Detta kan användas i databasen varhelst paketet 'paketnamn' kan kallas.
PL / SQL Raise Undantag
Alla fördefinierade undantag tas upp implicit närhelst felet inträffar. Men de användardefinierade undantagen måste tas upp uttryckligen. Detta kan uppnås med nyckelordet 'RAISE'. Detta kan användas på något av de sätt som nämns nedan.
Om 'RAISE' används separat i programmet kommer det redan upphöjda undantaget att spridas till det överordnade blocket. Endast i undantagsblock kan användas som visas nedan.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Syntaxförklaring:
- I ovanstående syntax används nyckelordet RAISE i undantagshanteringsblocket.
- När program stöter på undantag "exception_name" hanteras undantaget och kommer att slutföras normalt
- Men nyckelordet 'RAISE' i undantagshanteringsdelen sprider detta speciella undantag från det överordnade programmet.
Obs! När du höjer undantaget till föräldrablocket bör undantaget som höjs också vara synligt vid föräldrablocket, annars kommer oracle att kasta ett fel.
- Vi kan använda nyckelordet 'RAISE' följt av undantagsnamnet för att höja det specifika användardefinierade / fördefinierade undantaget. Detta kan användas i både exekveringsdel och i undantagshanteringsdel för att höja undantaget.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Syntaxförklaring:
- I ovanstående syntax används nyckelordet RAISE i exekveringsdelen följt av undantag "exception_name".
- Detta kommer att höja detta speciella undantag vid tidpunkten för utförandet, och detta måste hanteras eller höjas ytterligare.
Exempel 1 : I det här exemplet ska vi se
- Hur man deklarerar undantaget
- Hur man höjer det deklarerade undantaget och
- Hur man sprider det till huvudblocket
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/
Kodförklaring:
- Kodrad 2 : Förklarar variabeln 'sample_exception' som EXCEPTION-typ.
- Kodrad 3 : Förklaringsförfarande nested_block.
- Kodrad 6 : Skriva ut påståendet "Inuti kapslat block".
- Kodrad 7: Skriva ut påståendet "Raising sample_exception from nested block."
- Kodrad 8: Öka undantaget med 'RAISE sample_exception'.
- Kodrad 10: Undantagshanterare för undantagsexempelundantag i det kapslade blocket.
- Kodrad 11: Utskrift av uttalandet 'Undantag fångat i kapslat block. Lyft till huvudblock '.
- Kodrad 12: Höja undantaget från huvudblocket (förökas till huvudblocket).
- Kodrad 15: Utskrift av uttalandet "Inne i huvudblocket".
- Kodrad 16: Skriva ut påståendet "Calling nested block".
- Kodrad 17: Anropar nested_block-proceduren.
- Kodrad 19: Undantagshanterare för sample_exception i huvudblocket.
- Kodrad 20: Skriva ut påståendet "Undantag fångat i huvudblocket."
Viktiga punkter att notera i Undantag
- I funktion ska ett undantag alltid antingen returnera värde eller höja undantaget ytterligare. annars slår Oracle 'Funktion returnerad utan ett värde' -fel vid körning.
- Uttalanden om transaktionskontroll kan ges i undantagshanteringsblocket.
- SQLERRM och SQLCODE är de inbyggda funktionerna som ger undantagsmeddelandet och koden.
- Om ett undantag inte hanteras kommer alla aktiva transaktioner i den sessionen som standard att rullas tillbaka.
- RAISE_APPLICATION_ERROR (-
, ) kan användas istället för RAISE för att höja felet med användarkod och meddelande. Felkoden ska vara större än 20000 och föregå med '-'.
Sammanfattning
Efter detta kapitel. du bör kunna arbeta för följande aspekter av Pl SQL-undantag
- Hantering av undantagen
- Definiera ett undantag
- Höj undantaget
- Undantag förökning