Unntakshåndtering inn Oracle PL/SQL (eksempler)
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 under kjøring. Disse feilene vil ikke bli fanget opp på tidspunktet for kompilering, og disse må derfor kun håndteres under kjøringen.
For eksempel, hvis PL/SQL-motoren mottar en instruksjon om å dele et tall med '0', vil PL/SQL-motoren kaste det som et unntak. Unntaket heves kun under kjøretiden av PL/SQL-motoren.
Unntak vil stoppe programmet fra å kjøre videre, så for å unngå slike tilstander, må de fanges opp og håndteres separat. Denne prosessen kalles Exception-Handling, der programmereren håndterer unntaket som kan oppstå under kjøretiden.
Syntaks for unntakshåndtering
Unntak håndteres på blokknivå, dvs. en gang hvis et unntak oppstår i en blokk, vil kontrollen komme ut av utførelsesdelen av den blokken. Unntaket vil da bli håndtert ved unntakshåndteringsdelen av den blokken. Etter å ha håndtert unntaket, er det ikke mulig å sende kontrollen tilbake til utførelsesdelen av den blokken.
Syntaksen nedenfor forklarer hvordan du fanger opp og håndterer unntaket.
BEGIN <execution block> . . EXCEPTION WHEN <exceptionl_name> THEN <Exception handling code for the “exception 1 _name’' > WHEN OTHERS THEN <Default exception handling code for all exceptions > END;
Syntaks forklaring:
- I syntaksen ovenfor inneholder unntakshåndteringsblokken serier med WHEN-betingelse for å håndtere unntaket.
- Hver NÅR-betingelse etterfølges av unntaksnavnet som forventes å bli hevet under kjøretiden.
- Når et unntak oppstår under kjøretid, vil PL/SQL-motoren se i unntakshåndteringsdelen for det spesielle unntaket. Den vil starte fra den første 'WHEN'-klausulen, og sekvensielt vil den søke.
- Hvis den fant unntakshåndteringen for unntaket som har blitt reist, vil den utføre den aktuelle håndteringskodedelen.
- Hvis ingen av 'WHEN'-klausulen er tilstede for unntaket som har blitt opphevet, vil PL/SQL-motoren utføre 'WHEN OTHERS'-delen (hvis tilstede). Dette er felles for alle unntakene.
- Etter å ha utført unntaket, vil delkontroll gå ut av gjeldende blokk.
- Bare én unntaksdel kan utføres for en blokk under kjøring. Etter å ha utført det, vil kontrolleren hoppe over den gjenværende unntakshåndteringsdelen og vil gå ut av gjeldende blokk.
OBS: NÅR ANDRE skal alltid være på den siste posisjonen i sekvensen. Unntakshåndteringsdelen som er tilstede etter WHEN OTHERS vil aldri bli utført, da kontrollen vil gå ut av blokken etter å ha utført WHEN OTHERS.
Typer unntak
Det er to typer unntak i Pl/SQL.
- Forhåndsdefinerte unntak
- Brukerdefinert unntak
Forhåndsdefinerte unntak
Oracle har forhåndsdefinert et 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 unntaksnavnene direkte for å håndtere dem.
Nedenfor er noen forhåndsdefinerte unntak
Unntak | Feil kode | Unntaksårsak |
---|---|---|
ACCESS_INTO_NULL | ORA-06530 | Tilordne en verdi til attributtene til uinitialiserte 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 innsamlingsmetoder (unntatt EKSISTER) eller tilgang til samlingsattributter på en uinitialisert samling |
CURSOR_ALREADY_OPEN | ORA-06511 | Prøver å åpne en markør som allerede er åpnet |
DUP_VAL_ON_INDEX | ORA-00001 | Lagre 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 |
INVALID_NUMBER | ORA-01722 | Konvertering av tegn til et tall mislyktes på grunn av ugyldig talltegn |
NO_DATA_FOUND | ORA-01403 | Når 'SELECT'-setning som inneholder INTO-ledd henter ingen rader. |
ROW_MISMATCH | ORA-06504 | Når markørvariabeldatatypen er inkompatibel med den faktiske markørreturtypen |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Henviser samlingen med et indeksnummer som er større enn samlingsstørrelsen |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Henviser innsamling med et indeksnummer som er utenfor det lovlige området (f.eks.: -1) |
TOO_MANY_ROWS | ORA-01422 | Når en 'SELECT'-setning med INTO-ledd returnerer mer enn én rad |
VALUE_ERROR | ORA-06502 | Aritmetisk eller størrelsesbegrensningsfeil (f.eks.: tilordne en verdi til en variabel som er større enn variabelstørrelsen) |
ZERO_DIVIDE | ORA-01476 | Dele et tall med '0' |
Brukerdefinert unntak
In Oracle, bortsett fra de forhåndsdefinerte unntakene ovenfor, kan programmereren lage sine egne unntak og håndtere dem. De kan opprettes på delprogramnivå i deklarasjonsdelen. Disse unntakene er kun synlige i det underprogrammet. Unntaket som er definert i pakkespesifikasjonen er offentlig unntak, og det er synlig overalt hvor pakken er tilgjengelig.
Syntaks: På underprogramnivå
DECLARE <exception_name> EXCEPTION; BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> END;
- I syntaksen ovenfor er variabelen 'unntaksnavn' definert som 'UNNTAK'-type.
- Dette kan brukes som på lignende måte som et forhåndsdefinert unntak.
Syntaks:På pakkespesifikasjonsnivå
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- I syntaksen ovenfor er variabelen 'unntaksnavn' definert som 'EXCEPTION'-typen i pakkespesifikasjonen til .
- Dette kan brukes i databasen der pakken 'pakkenavn' kan kalles.
PL/SQL Raise-unntak
Alle forhåndsdefinerte unntak heves implisitt når feilen oppstår. Men de brukerdefinerte unntakene må heves eksplisitt. Dette kan oppnås ved å bruke søkeordet 'RAISE'. Dette kan brukes på en av måtene som er nevnt nedenfor.
Hvis 'RAISE' brukes separat i programmet, vil det spre det allerede opphevede unntaket til den overordnede blokken. Bare i unntaksblokk kan brukes som vist nedenfor.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
Syntaks forklaring:
- I syntaksen ovenfor brukes nøkkelordet RAISE i unntakshåndteringsblokken.
- Når programmet støter på unntaket "unntaksnavn", håndteres unntaket og vil bli fullført normalt
- Men nøkkelordet 'RAISE' i unntakshåndteringsdelen vil spre dette spesielle unntaket til det overordnede programmet.
OBS: Mens du hever unntaket til den overordnede blokken, bør unntaket som blir hevet også være synlig ved overordnet blokk, ellers vil oracle gi en feil.
- Vi kan bruke søkeordet «RAISE» etterfulgt av unntaksnavnet for å øke det aktuelle brukerdefinerte/forhåndsdefinerte unntaket. Dette kan brukes både i utførelsesdelen og i unntakshåndteringsdelen for å heve unntaket.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Syntaks forklaring:
- I syntaksen ovenfor brukes nøkkelordet RAISE i utførelsesdelen etterfulgt av unntaket "exception_name".
- Dette vil ta opp dette spesielle unntaket på tidspunktet for utførelse, 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 spre det til hovedblokken
DECLARE Sample_exception EXCEPTION; PROCEDURE nested_block IS BEGIN Dbms_output.put_line(‘Inside nested block’); Dbms_output.put_line(‘Raising sample_exception from nested block’); RAISE sample_exception; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in nested block. Raising to main block’); RAISE, END; BEGIN Dbms_output.put_line(‘Inside main block’); Dbms_output.put_line(‘Calling nested block’); Nested_block; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block'); END: /
Kodeforklaring:
- Kodelinje 2: Erklærer variabelen 'sample_exception' som EXCEPTION-type.
- Kodelinje 3: Erklærer prosedyre nested_block.
- Kodelinje 6: Skriver ut setningen "Inside nested block".
- Kodelinje 7: Skriver ut setningen «Høye sample_exception fra nestet blokk».
- Kodelinje 8: Heve unntaket ved å bruke 'RAISE sample_exception'.
- Kodelinje 10: Unntaksbehandler for unntak sample_exception i den nestede blokken.
- Kodelinje 11: Skriver ut setningen 'Unntak fanget i nestet blokk. Heving til hovedblokk'.
- Kodelinje 12: Heve unntaket til hovedblokken (forplanter seg til hovedblokken).
- Kodelinje 15: Skriver ut setningen "Inne i hovedblokken".
- Kodelinje 16: Skriver ut setningen "Calling nested block".
- Kodelinje 17: Kaller nested_block-prosedyre.
- Kodelinje 18: Unntak
- Kodelinje 19: Unntaksbehandler for sample_exception i hovedblokken.
- Kodelinje 20: Skriver ut setningen "Unntak fanget i hovedblokken."
Viktige punkter å merke seg i Unntak
- I funksjon skal et unntak alltid enten returnere verdi eller øke unntaket ytterligere. ellers Oracle vil gi 'Funksjon returnert uten en verdi'-feil under kjøring.
- Transaksjonskontrollutsagn kan gis ved unntakshåndteringsblokk.
- SQLERRM og SQLCODE er de innebygde funksjonene som vil gi unntaksmeldingen og koden.
- Hvis et unntak ikke håndteres, vil som standard alle aktive transaksjoner i den økten bli rullet tilbake.
- RAISE_APPLICATION_ERROR (- , ) kan brukes i stedet for RAISE for å øke feilen med brukerkode og melding. Feilkoden skal være større enn 20000 XNUMX og ha «-» foran.
Oppsummering
Etter dette kapittelet. du bør kunne jobbe for følgende aspekter av Pl SQL unntak
- Håndtere unntakene
- Definer et unntak
- Hev unntaket
- Unntaksforplantning