Oracle PL / SQL Exception Handling: Exempel för att höja användardefinierat undantag

Innehållsförteckning:

Anonim

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 THENWHEN OTHERSTHENEND;

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.

  1. Fördefinierade undantag
  2. 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å

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • 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 PACKAGE 
IS 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  THENRAISE;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  THENEND;

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