Hvad er undtagelseshåndtering i PL / SQL?
En undtagelse opstår, når PL / SQL-motoren støder på en instruktion, som den ikke kan udføre på grund af en fejl, der opstår ved kørsel. Disse fejl registreres ikke på tidspunktet for kompilering, og derfor er disse kun nødvendige for at køre i løbetiden.
For eksempel, hvis PL / SQL-motor modtager en instruktion om at dividere et hvilket som helst tal med '0', så kaster PL / SQL-motoren det som en undtagelse. Undtagelsen hæves kun ved PL / SQL-motoren under kørsel.
Undtagelser forhindrer programmet i at udføre yderligere, så for at undgå en sådan tilstand skal de fanges og håndteres separat. Denne proces kaldes Exception-Handling, hvor programmereren håndterer den undtagelse, der kan forekomme på kørselstidspunktet.
I denne vejledning lærer du følgende emner-
- Syntaks med undtagelseshåndtering
- Typer af undtagelser
- Foruddefinerede undtagelser
- Brugerdefineret undtagelse
- PL / SQL hæve undtagelse
- Vigtige punkter at bemærke i undtagelse
Syntaks med undtagelseshåndtering
Undtagelser håndteres på blokken, niveau, dvs. en gang, hvis der forekommer en undtagelse i en hvilken som helst blok, vil kontrollen komme ud af eksekveringsdelen af denne blok. Undtagelsen håndteres derefter i den undtagelseshåndteringsdel af blokken. Efter håndtering af undtagelsen er det ikke muligt at sende kontrol tilbage til eksekveringsafsnittet for den pågældende blok.
Nedenstående syntaks forklarer, hvordan man fanger og håndterer undtagelsen.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Syntaks Forklaring:
- I ovenstående syntaks indeholder undtagelseshåndteringsblokken serier af WHEN-tilstand til håndtering af undtagelsen.
- Hver NÅR-tilstand følges af undtagelsesnavnet, som forventes hævet på kørselstidspunktet.
- Når en undtagelse hæves ved kørsel, ser PL / SQL-motoren i undtagelseshåndteringsdelen for den særlige undtagelse. Det starter fra den første 'NÅR' klausul, og sekventielt søger den.
- Hvis den fandt undtagelseshåndteringen for den undtagelse, der er hævet, udfører den den pågældende håndteringskodedel.
- Hvis ingen af 'WHEN'-klausulen er til stede for den undtagelse, der er hævet, vil PL / SQL-motoren udføre' WHEN ANDRE '-delen (hvis den findes). Dette er almindeligt for alle undtagelser.
- Efter udførelse af undtagelsen vil delkontrol gå ud af den aktuelle blok.
- Kun en undtagelsesdel kan udføres for en blok ved kørselstid. Efter udførelse af den springer controlleren over den resterende undtagelseshåndteringsdel og går ud af den aktuelle blok.
Bemærk: NÅR ANDRE altid skal være i den sidste position i sekvensen. Den undtagelseshåndteringsdel, der er til stede efter NÅR ANDRE bliver aldrig udført, da kontrollen udgår fra blokken efter udførelse af NÅR ANDRE.
Typer af undtagelser
Der er to typer undtagelser i Pl / SQL.
- Foruddefinerede undtagelser
- Brugerdefineret undtagelse
Foruddefinerede undtagelser
Oracle har foruddefineret en almindelig undtagelse. Disse undtagelser har et unikt undtagelsesnavn og fejlnummer. Disse undtagelser er allerede defineret i pakken 'STANDARD' i Oracle. I kode kan vi direkte bruge disse foruddefinerede undtagelsesnavne til at håndtere dem.
Nedenfor er de få foruddefinerede undtagelser
Undtagelse | Fejlkode | Undtagelsesårsag |
ACCESS_INTO_NULL | ORA-06530 | Tildel en værdi til attributterne for ikke-initialiserede objekter |
CASE_NOT_FOUND | ORA-06592 | Ingen af 'WHEN'-klausulen i CASE-erklæringen er opfyldt, og ingen' ELSE'-klausul er specificeret |
COLLECTION_IS_NULL | ORA-06531 | Brug af indsamlingsmetoder (undtagen EXISTS) eller adgang til indsamlingsattributter på en ikke-initialiseret samling |
CURSOR_ALREADY_OPEN | ORA-06511 | Forsøger at åbne en markør, der allerede er åbnet |
DUP_VAL_ON_INDEX | ORA-00001 | Lagring af en duplikatværdi i en databasesøjle, der er begrænset af unikt indeks |
INVALID_CURSOR | ORA-01001 | Ulovlige markørhandlinger som at lukke en uåbnet markør |
INVALID_NUMBER | ORA-01722 | Konvertering af tegn til et nummer mislykkedes på grund af ugyldigt taltegn |
INGEN DATA FUNDET | ORA-01403 | Når 'SELECT' -udtalelse, der indeholder INTO-klausul, ikke henter nogen rækker. |
ROW_MISMATCH | ORA-06504 | Når markørvariabeldatatypen er inkompatibel med den aktuelle type markørretur |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Henvisning til samling med et indeksnummer, der er større end samlingens størrelse |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Henvisning til indsamling med et indeksnummer, der er uden for det lovlige område (f.eks: -1) |
TOO_MANY_ROWS | ORA-01422 | Når en SELECT-sætning med INTO-klausul returnerer mere end en række |
VALUE_ERROR | ORA-06502 | Aritmetik- eller størrelsesbegrænsningsfejl (f.eks. Tildeler en værdi til en variabel, der er større end den variable størrelse) |
ZERO_DIVIDE | ORA-01476 | Dele et tal med '0' |
Brugerdefineret undtagelse
I Oracle, bortset fra de ovennævnte foruddefinerede undtagelser, kan programmøren oprette deres egen undtagelse og håndtere dem. De kan oprettes på et underprogramniveau i erklæringsdelen. Disse undtagelser er kun synlige i det underprogram. Undtagelsen, der er defineret i pakkespecifikationen, er offentlig undtagelse, og den er synlig, hvor pakken er tilgængelig. <
Syntaks: På underprogramniveau
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- I ovenstående syntaks er variablen 'exception_name' defineret som 'EXCEPTION' type.
- Dette kan bruges på en lignende måde som en foruddefineret undtagelse.
Syntaks: På pakkspecifikationsniveau
CREATE PACKAGEIS EXCEPTION;… END ;
- I ovenstående syntaks er variablen 'undtagelsesnavn' defineret som 'UNDTAGELSE' -type i pakkespecifikationen for
. - Dette kan bruges i databasen, hvor der kan kaldes pakke 'pakkenavn'.
PL / SQL hæve undtagelse
Alle de foruddefinerede undtagelser hæves implicit, hver gang fejlen opstår. Men de brugerdefinerede undtagelser skal hæves eksplicit. Dette kan opnås ved hjælp af nøgleordet 'RAISE'. Dette kan bruges på en af nedenstående måder.
Hvis 'RAISE' bruges separat i programmet, vil den udbrede den allerede hævede undtagelse til den overordnede blok. Kun undtagelsesblok kan bruges som vist nedenfor.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Syntaks Forklaring:
- I ovenstående syntaks bruges nøgleordet RAISE i undtagelseshåndteringsblokken.
- Hver gang programmet støder på undtagelse "undtagelsesnavn", håndteres undtagelsen og afsluttes normalt
- Men nøgleordet 'RAISE' i undtagelseshåndteringsdelen udbreder denne særlige undtagelse til det overordnede program.
Bemærk: Mens du hæver undtagelsen til overordnet blok, skal den undtagelse, der bliver rejst, også være synlig ved overordnet blok, ellers kaster oracle en fejl.
- Vi kan bruge nøgleordet 'RAISE' efterfulgt af undtagelsesnavnet til at hæve den særlige brugerdefinerede / foruddefinerede undtagelse. Dette kan bruges i både eksekveringsdel og i undtagelseshåndteringsdel for at hæve undtagelsen.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Syntaks Forklaring:
- I ovenstående syntaks bruges nøgleordet RAISE i udførelsesdelen efterfulgt af undtagelse "exception_name".
- Dette hæver denne særlige undtagelse på tidspunktet for udførelsen, og dette skal håndteres eller hæves yderligere.
Eksempel 1 : I dette eksempel skal vi se
- Sådan erklæres undtagelsen
- Hvordan man hæver den erklærede undtagelse og
- Sådan spredes det til hovedblokken
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:/
Kode Forklaring:
- Kodelinje 2 : Erklærer variablen 'sample_exception' som EXCEPTION-type.
- Kodelinje 3 : Erklæringsprocedure nested_block.
- Kodelinje 6 : Udskrivning af udsagnet "Inde i indlejret blok".
- Kodelinje 7: Udskrivning af udsagnet "Raising sample_exception from nested block."
- Kodelinje 8: Hævelse af undtagelsen ved hjælp af 'RAISE sample_exception'.
- Kodelinje 10: Undtagelsesbehandler til undtagelse sample_exception i den indlejrede blok.
- Kodelinje 11: Udskrivning af udsagnet 'Undtagelse fanget i indlejret blok. Hæv til hovedblok '.
- Kodelinje 12: Hævelse af undtagelsen til hovedblok (udbredelse til hovedblok).
- Kodelinje 15: Udskrivning af udsagnet "Inde i hovedblokken".
- Kodelinje 16: Udskrivning af udsagnet "Opkald til indlejret blok".
- Kodelinje 17: Opkald til proceduren nested_block.
- Kodelinje 19: Undtagelsesbehandler til sample_exception i hovedblokken.
- Kodelinje 20: Udskrivning af udsagnet "Undtagelse fanget i hovedblokken."
Vigtige punkter at bemærke i undtagelse
- I funktion skal en undtagelse altid enten returnere værdi eller hæve undtagelsen yderligere. Ellers kaster Oracle 'Funktion returneret uden en værdi' -fejl ved kørselstid.
- Transaktionskontrolerklæringer kan gives i undtagelseshåndteringsblokken.
- SQLERRM og SQLCODE er de indbyggede funktioner, der giver undtagelsesmeddelelsen og koden.
- Hvis en undtagelse ikke håndteres, rulles som standard alle de aktive transaktioner i den session tilbage.
- RAISE_APPLICATION_ERROR (-
, ) kan bruges i stedet for RAISE til at hæve fejlen med brugerkode og meddelelse. Fejlkode skal være større end 20000 og forud for '-'.
Resumé
Efter dette kapitel. du skal være i stand til at arbejde for følgende aspekter af Pl SQL-undtagelser
- Håndtering af undtagelserne
- Definer en undtagelse
- Hæv undtagelsen
- Undtagelsesformering