Undtagelseshåndtering ind Oracle PL/SQL (eksempler)

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 under kørslen. Disse fejl vil ikke blive fanget på tidspunktet for kompilering, og derfor skal disse kun håndteres under kørslen.

For eksempel, hvis PL/SQL-motoren modtager en instruktion om at dividere et hvilket som helst tal med '0', vil PL/SQL-motoren kaste det som en undtagelse. Undtagelsen hæves kun under køretiden af ​​PL/SQL-motoren.

Undtagelser vil forhindre programmet i at køre yderligere, så for at undgå en sådan tilstand skal de fanges og håndteres separat. Denne proces kaldes Exception-Handling, hvor programmøren håndterer den undtagelse, der kan opstå under kørselstiden.

Undtagelseshåndteringssyntaks

Undtagelser håndteres på blok, niveau, dvs. når en undtagelse opstår i en blok, så vil kontrollen komme ud af eksekveringsdelen af ​​den blok. Undtagelsen vil så blive håndteret ved undtagelseshåndteringsdelen af ​​den pågældende blok. Efter håndtering af undtagelsen er det ikke muligt at sende kontrol tilbage til udførelsessektionen af ​​den pågældende blok.

Nedenstående syntaks forklarer, hvordan man fanger og håndterer undtagelsen.

Undtagelseshåndtering i PL/SQL

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 ovenstående syntaks indeholder undtagelseshåndteringsblokken serier af WHEN-betingelser for at håndtere undtagelsen.
  • Hver WHEN-tilstand efterfølges af undtagelsesnavnet, som forventes at blive hævet under kørselstiden.
  • Når en undtagelse opstår under kørsel, vil PL/SQL-motoren se i undtagelseshåndteringsdelen for den pågældende undtagelse. Den starter fra den første 'WHEN'-klausul, og sekventielt vil den søge.
  • Hvis den fandt undtagelseshåndteringen for den undtagelse, der er blevet rejst, vil den udføre den pågældende håndteringskodedel.
  • Hvis ingen af ​​'WHEN'-sætningen er til stede for den undtagelse, der er blevet rejst, vil PL/SQL-motoren udføre 'WHEN OTHERS'-delen (hvis den findes). Dette er fælles for alle undtagelserne.
  • Efter eksekvering af undtagelsen vil delkontrol gå ud af den aktuelle blok.
  • Kun én undtagelsesdel kan udføres for en blok under kørsel. Efter at have udført det, vil controlleren springe den resterende undtagelseshåndtering over og gå ud af den aktuelle blok.

Bemærk: NÅR ANDRE skal altid være på den sidste position i sekvensen. Undtagelseshåndteringsdelen, der er til stede efter WHEN OTHERS, vil aldrig blive udført, da kontrollen vil forlade blokken efter at have udført WHEN OTHERS.

Typer af undtagelser

Der er to typer undtagelser i Pl/SQL.

  1. Foruddefinerede undtagelser
  2. Brugerdefineret undtagelse

Foruddefinerede undtagelser

Oracle har foruddefineret nogle almindelige undtagelser. Disse undtagelser har et unikt undtagelsesnavn og fejlnummer. Disse undtagelser er allerede defineret i 'STANDARD'-pakken 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'-sætningen i CASE-sætningen er opfyldt, og ingen 'ELSE'-sætning er specificeret
COLLECTION_IS_NULL ORA-06531 Brug af indsamlingsmetoder (undtagen EKSISTERER) eller adgang til samlingsattributter på en ikke-initialiseret samling
CURSOR_ALREADY_OPEN ORA-06511 Forsøger at åbne en markøren som allerede er åbnet
DUP_VAL_ON_INDEX ORA-00001 Lagring af en dubletværdi i en databasekolonne, 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 tal mislykkedes på grund af ugyldigt taltegn
INGEN DATA FUNDET ORA-01403 Når 'SELECT'-sætning, der indeholder INTO-sætning, henter ingen rækker.
ROW_MISMATCH ORA-06504 Når cursorvariabeldatatypen er inkompatibel med den faktiske cursorreturtype
SUBSCRIPT_BEYOND_COUNT ORA-06533 Henvisning af samling med et indeksnummer, der er større end samlingsstørrelsen
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Henvisning af indsamling med et indeksnummer, der ligger uden for det lovlige område (f.eks.: -1)
TOO_MANY_ROWS ORA-01422 Når en 'SELECT'-sætning med INTO-sætning returnerer mere end én række
VALUE_ERROR ORA-06502 Aritmetisk eller størrelsesbegrænsningsfejl (f.eks.: tildeling af en værdi til en variabel, der er større end den variable størrelse)
ZERO_DIVIDE ORA-01476 At dividere et tal med '0'

Brugerdefineret undtagelse

In Oracle, bortset fra de ovenfor definerede undtagelser, kan programmøren oprette deres egen undtagelse og håndtere dem. De kan oprettes på underprogramniveau i deklarationsdelen. Disse undtagelser er kun synlige i det pågældende underprogram. Undtagelsen, der er defineret i pakkespecifikationen, er offentlig undtagelse, og den er synlig overalt, hvor pakken er tilgængelig.

Syntaks: På underprogramniveau

DECLARE
<exception_name> EXCEPTION; 
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
<Handler>
END;
  • I ovenstående syntaks er variablen 'exception_name' defineret som 'EXCEPTION'-typen.
  • Dette kan bruges som på en lignende måde som en foruddefineret undtagelse.

Syntaks:På pakkespecifikationsniveau

CREATE PACKAGE <package_name>
 IS
<exception_name> EXCEPTION;
.
.
END <package_name>;
  • I ovenstående syntaks er variablen 'exception_name' defineret som 'EXCEPTION'-typen i pakkespecifikationen af .
  • Dette kan bruges i databasen, hvor pakken 'pakkenavn' kan kaldes.

PL/SQL Raise-undtagelse

Alle de foruddefinerede undtagelser hæves implicit, når fejlen opstår. Men de brugerdefinerede undtagelser skal hæves eksplicit. Dette kan opnås ved at bruge søgeordet 'RAISE'. Dette kan bruges på en af ​​nedenstående måder.

Hvis 'RAISE' bruges separat i programmet, vil det sprede den allerede rejste undtagelse til den overordnede blok. Kun i undtagelsesblok kan bruges som vist nedenfor.

PL/SQL Raise-undtagelse

CREATE [ PROCEDURE | FUNCTION ]
 AS
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
             <Handler>
RAISE;
END;

Syntaks forklaring:

  • I ovenstående syntaks bruges nøgleordet RAISE i undtagelseshåndteringsblokken.
  • Når programmet støder på undtagelsen "exception_name", håndteres undtagelsen og vil blive fuldført normalt
  • Men nøgleordet 'RAISE' i undtagelseshåndteringsdelen vil udbrede denne særlige undtagelse til det overordnede program.

Bemærk: Mens du hæver undtagelsen til den overordnede blok, bør den undtagelse, der bliver hævet, også være synlig ved den overordnede blok, ellers vil oracle give en fejl.

  • Vi kan bruge søgeordet 'RAISE' efterfulgt af undtagelsesnavnet for at rejse den pågældende brugerdefinerede/foruddefinerede undtagelse. Dette kan bruges i både udførelsesdelen og i undtagelseshåndteringsdelen for at hæve undtagelsen.

PL/SQL Raise-undtagelse

CREATE [ PROCEDURE | FUNCTION ] 
AS
BEGIN
<Execution block>
RAISE <exception_name>
EXCEPTION
WHEN <exception_name> THEN
<Handler>
END;

Syntaks forklaring:

  • I ovenstående syntaks bruges nøgleordet RAISE i udførelsesdelen efterfulgt af undtagelsen "exception_name".
  • Dette vil rejse 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ærer du undtagelsen
  • Hvordan man rejser den erklærede undtagelse og
  • Sådan udbredes det til hovedblokken

PL/SQL Raise-undtagelse

PL/SQL Raise-undtagelse

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 variablen 'sample_exception' som EXCEPTION-type.
  • Kodelinje 3: Erklærer procedure nested_block.
  • Kodelinje 6: Udskrivning af erklæringen "Inde i indlejret blok".
  • Kodelinje 7: Udskrivning af sætningen "Hæver sample_exception fra indlejret blok."
  • Kodelinje 8: Hæve undtagelsen ved hjælp af 'RAISE sample_exception'.
  • Kodelinje 10: Undtagelsesbehandler for undtagelse sample_exception i den indlejrede blok.
  • Kodelinje 11: Udskrivning af sætningen 'Undtagelse fanget i indlejret blok. Hæve til hovedblok'.
  • Kodelinje 12: Hæve undtagelsen til hovedblokken (udbredelse til hovedblokken).
  • Kodelinje 15: Udskrivning af erklæringen "Inde i hovedblokken".
  • Kodelinje 16: Udskrivning af sætningen "Calling nested block".
  • Kodelinje 17: Kalder nested_block procedure.
  • Kodelinje 18: undtagelse
  • Kodelinje 19: Undtagelsesbehandler for sample_exception i hovedblokken.
  • Kodelinje 20: Udskrivning af erklæringen "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. andet Oracle vil give 'Funktion returneret uden en værdi' fejl ved kørsel.
  • Transaktionskontroludsagn kan gives ved undtagelseshåndteringsblok.
  • SQLERRM og SQLCODE er de indbyggede funktioner, der giver undtagelsesmeddelelsen og koden.
  • Hvis en undtagelse ikke håndteres, vil alle de aktive transaktioner i den session som standard blive rullet tilbage.
  • RAISE_APPLICATION_ERROR (- , ) kan bruges i stedet for RAISE til at rejse fejlen med brugerkode og besked. Fejlkoden skal være større end 20000 og have '-' foran.

Resumé

Efter dette kapitel. du skal kunne arbejde med følgende aspekter af Pl SQL undtagelser

  • Håndtering af undtagelser
  • Definer en undtagelse
  • Hæv undtagelsen
  • Udbredelse af undtagelser