Hva er unntakshåndtering i PL / SQL?
Et unntak oppstår når PL / SQL-motoren møter en instruksjon som den ikke kan utføre på grunn av en feil som oppstår ved kjøretid. Disse feilene blir ikke fanget opp på tidspunktet for kompilering, og derfor er disse bare nødvendig å håndtere på kjøretiden.
For eksempel, hvis PL / SQL-motor mottar en instruksjon om å dele et hvilket som helst tall med '0', vil PL / SQL-motoren kaste det som et unntak. Unntaket heves bare i løpet av PL / SQL-motoren.
Unntak vil forhindre at programmet kjøres videre, så for å unngå en slik tilstand må de fanges opp og håndteres separat. Denne prosessen kalles Exception-Handling, der programmereren håndterer unntaket som kan oppstå på kjøretiden.
I denne opplæringen lærer du følgende emner-
- Syntaks for unntakshåndtering
- Typer av unntak
- Forhåndsdefinerte unntak
- Brukerdefinert unntak
- PL / SQL Raise Exception
- Viktige punkter å merke seg i Unntak
Syntaks for unntakshåndtering
Unntak håndteres på blokken, nivå, det vil si at en gang hvis noe unntak forekommer i en hvilken som helst blokk, vil kontrollen komme ut av utførelsesdelen av den blokken. Unntaket vil deretter bli håndtert på unntakshåndteringsdelen av blokken. Etter håndtering av unntaket er det ikke mulig å sende kontrollen tilbake til utførelsesdelen av den blokken.
Syntaksen nedenfor forklarer hvordan du kan fange og håndtere unntaket.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Syntaks Forklaring:
- I syntaksen ovenfor inneholder unntaksbehandlingsblokken serier av NÅR-tilstand for å håndtere unntaket.
- Hver NÅR-tilstand følges av unntaksnavnet som forventes å bli hevet på kjøretiden.
- Når et unntak heves under kjøretid, vil PL / SQL-motoren se i unntakshåndteringsdelen for det spesielle unntaket. Den starter fra den første 'NÅR-setningen, og sekvensielt vil den søke.
- Hvis den fant unntakshåndteringen for unntaket som er hevet, vil den utføre den bestemte håndteringskodedelen.
- Hvis ingen av "NÅR" -klausulen er tilstede for unntaket som er hevet, vil PL / SQL-motoren utføre delen "NÅR ANDRE" (hvis den er tilstede). Dette er vanlig for alle unntakene.
- Etter å ha utført unntaket, vil delekontroll gå ut av den nåværende blokken.
- Bare en unntaksdel kan utføres for en blokk ved kjøretid. Etter å ha utført den, vil kontrolleren hoppe over den gjenværende delen for unntakshåndtering og vil gå ut av den nåværende blokken.
Merk: NÅR ANDRE alltid skal være i siste posisjon i sekvensen. Unntakshåndteringsdelen som er til stede etter NÅR ANDRE vil aldri bli henrettet, da kontrollen vil gå ut av blokken etter å ha utført NÅR ANDRE.
Typer av unntak
Det er to typer unntak i Pl / SQL.
- Forhåndsdefinerte unntak
- Brukerdefinert unntak
Forhåndsdefinerte unntak
Oracle har forhåndsdefinert noe vanlig unntak. Disse unntakene har et unikt unntaksnavn og feilnummer. Disse unntakene er allerede definert i 'STANDARD' -pakken i Oracle. I kode kan vi bruke disse forhåndsdefinerte unntaksnavnet direkte til å håndtere dem.
Nedenfor er noen få forhåndsdefinerte unntak
Unntak | Feil kode | Unntak Grunn |
ACCESS_INTO_NULL | ORA-06530 | Tilordne en verdi til attributtene til ikke-initialiserte objekter |
CASE_NOT_FOUND | ORA-06592 | Ingen av 'WHEN'-klausulen i CASE-setningen er oppfylt, og ingen' ELSE'-klausul er spesifisert |
COLLECTION_IS_NULL | ORA-06531 | Bruke samlingsmetoder (unntatt EXISTS) eller få tilgang til samleattributter på en ikke-initialisert samling |
CURSOR_ALREADY_OPEN | ORA-06511 | Prøver å åpne en markør som allerede er åpnet |
DUP_VAL_ON_INDEX | ORA-00001 | Lagring av en duplikatverdi i en databasekolonne som er begrenset av unik indeks |
INVALID_CURSOR | ORA-01001 | Ulovlige markøroperasjoner som å lukke en uåpnet markør |
FEIL NUMMER | ORA-01722 | Konvertering av tegn til et nummer mislyktes på grunn av ugyldig talltegn |
INGEN DATA FUNNET | ORA-01403 | Når 'SELECT' -uttrykk som inneholder INTO-ledd ikke henter noen rader. |
ROW_MISMATCH | ORA-06504 | Når datatypen for markørvariabelen er inkompatibel med den aktuelle returtypen |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Henvisende samling med et indeksnummer som er større enn samlingsstørrelsen |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Henvisende samling med et indeksnummer som er utenfor det lovlige området (f.eks: -1) |
TOO_MANY_ROWS | ORA-01422 | Når en 'VELG' -uttrykk med INTO-ledd returnerer mer enn en rad |
VALUE_ERROR | ORA-06502 | Aritmetikk eller størrelsesbegrensningsfeil (f.eks: tilordne en verdi til en variabel som er større enn den variable størrelsen) |
ZERO_DIVIDE | ORA-01476 | Dele et tall med '0' |
Brukerdefinert unntak
I Oracle, bortsett fra de ovennevnte forhåndsdefinerte unntakene, kan programmereren lage sitt eget unntak og håndtere dem. De kan opprettes på underprogramnivå i erklæringsdelen. Disse unntakene er bare synlige i det underprogrammet. Unntaket som er definert i pakkespesifikasjonen er offentlig unntak, og det er synlig hvor pakken er tilgjengelig. <
Syntaks: På underprogramnivå
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- I ovenstående syntaks er variabelen 'unntaksnavn' definert som 'UNNTAK' -typen.
- Dette kan brukes på en lignende måte som et forhåndsdefinert unntak.
Syntaks: På pakkspesifikasjonsnivå
CREATE PACKAGEIS EXCEPTION;… END ;
- I den ovennevnte syntaksen er variabelen 'unntaksnavn' definert som 'UNNTAK' -typen i pakkespesifikasjonen for
. - Dette kan brukes i databasen der pakken 'package_name' kan kalles.
PL / SQL Raise Exception
Alle de forhåndsdefinerte unntakene heves implisitt når feilen oppstår. Men de brukerdefinerte unntakene må løftes eksplisitt. Dette kan oppnås ved å bruke nøkkelordet 'RAISE'. Dette kan brukes på en av måtene som er nevnt nedenfor.
Hvis 'RAISE' brukes separat i programmet, vil den spre det allerede hevede unntaket til foreldreblokken. Bare i unntak kan blokken brukes som vist nedenfor.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Syntaks Forklaring:
- I syntaksen ovenfor brukes nøkkelordet RAISE i unntakshåndteringsblokken.
- Når programmet støter på unntak "unntaksnavn", håndteres unntaket og fullføres normalt
- Men nøkkelordet 'RAISE' i delen for unntakshåndtering vil spre dette spesielle unntaket til det overordnede programmet.
Merk: Når du hever unntaket til foreldreblokken, bør unntaket som blir reist også være synlig ved foreldreblokken, ellers vil oracle kaste en feil.
- Vi kan bruke nøkkelordet 'RAISE' etterfulgt av unntaksnavnet for å heve det spesifikke brukerdefinerte / forhåndsdefinerte unntaket. Dette kan brukes i både utførelsesdel og i unntakshåndteringsdel for å heve unntaket.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Syntaks Forklaring:
- I syntaksen ovenfor brukes nøkkelordet RAISE i utførelsesdelen etterfulgt av unntak "unntaksnavn".
- Dette vil heve dette spesielle unntaket på tidspunktet for utførelsen, og dette må håndteres eller heves ytterligere.
Eksempel 1 : I dette eksemplet skal vi se
- Hvordan erklære unntaket
- Hvordan heve det erklærte unntaket og
- Hvordan forplante den 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 : Deklarerer variabelen 'sample_exception' som EXCEPTION-type.
- Kodelinje 3 : Deklarasjonsprosedyre nested_block.
- Kodelinje 6 : Utskrift av utsagnet "Inside nested block".
- Kodelinje 7: Utskrift av utsagnet "Raising sample_exception from nested block."
- Kodelinje 8: Å heve unntaket ved hjelp av 'RAISE sample_exception'.
- Kodelinje 10: Unntakshåndtering for unntak sample_eksepsjon i den nestede blokken.
- Kodelinje 11: Utskrift av utsagnet 'Unntak fanget i nestet blokk. Heving til hovedblokk '.
- Kodelinje 12: Heving av unntaket fra hovedblokk (forplantning til hovedblokk).
- Kodelinje 15: Utskrift av utsagnet "Inne i hovedblokken".
- Kodelinje 16: Utskrift av utsagnet "Calling nested block".
- Kodelinje 17: Ringer prosedyren nested_block.
- Kodelinje 19: Unntakshåndterer for eksempeleksempel i hovedblokken.
- Kodelinje 20: Utskrift av utsagnet "Unntak fanget i hovedblokken."
Viktige punkter å merke seg i Unntak
- I funksjon skal et unntak alltid enten returnere verdi eller heve unntaket ytterligere. ellers vil Oracle kaste feilen 'Funksjon returnert uten verdi' ved kjøretid.
- Uttalelser om transaksjonskontroll kan gis ved unntakshåndteringsblokk.
- SQLERRM og SQLCODE er de innebygde funksjonene som gir unntaksmeldingen og koden.
- Hvis et unntak ikke håndteres, vil alle aktive transaksjoner i den økten som standard rulles tilbake.
- RAISE_APPLICATION_ERROR (-
, ) kan brukes i stedet for RAISE for å heve feilen med brukerkode og melding. Feilkoden skal være større enn 20000 og foran "-".
Sammendrag
Etter dette kapitlet. du skal kunne arbeide for følgende aspekter av Pl SQL-unntak
- Håndtering av unntakene
- Definer et unntak
- Hev unntaket
- Unntak forplantning