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.
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.
- Foruddefinerede undtagelser
- 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.
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.
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
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