Oracle PL / SQL Unntakshåndtering: Eksempler for å øke brukerdefinert unntak

Innholdsfortegnelse:

Anonim

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

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.

  1. Forhåndsdefinerte unntak
  2. 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å

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

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