A PL/SQL rendelkezik kivételkezelést támogató eszközökkel. A nyelv kivételkezelése blokk-szintű. Vagyis utasításblokkokhoz rendelhetünk kivételkezelő eljárásokat úgy, hogy a blokk végén az EXCEPTION kulcsszó után WHEN ágakban felsoroljuk a kezelni kívánt kivételeket, majd a THEN kulcsszó után leírjuk a végrehajtandó utasításokat. Több ilyen WHEN ágat is létrehozhatunk, különböző kivételek lekezelésére (egy WHEN ágban OR-al “elválasztva” több kivétel is megadható), a végén pedig egy WHEN OTHERS ágat is megadhatunk.
Egy kivételt a RAISE utasítás segítségével válthatunk ki.
Példa:
PL/SQL-ben a kivételeknek két típusa létezik. Név szerint, a kivételek lehetnek belsők, illetve felhasználó által definiáltak. A belső kivételek a rendszer megfelelő műveleteihez vannak hozzárendelve és alapállapotban legnagyobb részük nem rendelkezik névvel. Szerencsére van néhány belső kivétel, amelyhez - a munka megkönnyítése érdekében - a rendszer társít nevet (a NO_DATA_FOUND is ilyen), de a többi, nem nevesített kivételhez is rendelhetünk nevet az EXCEPTION_INIT pragma segítségével.
Használata:
A nem nevesített belső kivételeket csak a kivételkezelő rész OTHERS ágában tudjuk kezelni.
Természetesen mi is definiálhatunk kivételeket az EXCEPTION kulcsszó segítségével. Fontos megjegyzés, hogy az EXCEPTION nem típus, csupán egy kulcsszó, amellyel kivételeket deklarálhatunk. Az általunk deklarált kivételek gyakorlatilag csak egy névnek számítanak, amelyet használhatunk kivételek kiváltására, de akár hozzárendelhetünk egy belső hibakódhoz is.
Az előre definiált kivételek a STANDARD package-ben vannak deklarálva az alábbi módon.
A legfontosabb előre definiált kivételek a következők:
Példa:
A rendszer fenntart egy intervallumot (-20000..-20999) a felhasználó által kiváltott, illetve definiált hibák számára. Ezzel a technikával mi is kiválthatunk nem nevesített kivételeket. Ezt a RAISE_APPLICATION_ERROR eljárással tehetjük meg.
Használata:
A RAISE_APPLICATION_ERROR-t csak alprogramban hívhatjuk, meghívásakor azonnal befejeződik az alprogram futása és a vezérlés visszatér a hívó programhoz a megfelelő hibakóddal, amelyet kivételként lekezelhetünk.
Nevesített kivételek kiváltására a RAISE utasítás használható.
Alprogramok hibáinak lekezelése:
A DBMS_STANDARD package raise_application_error(hibakód, hibaüzenet) procedúrájával az alprogramokból úgy térhetünk vissza, hogy egy megfelelő hibakódot adunk vissza a hívónak, amit az lekezelhet, ha a deklarációjában adott neki egy nevet. (A megadható hibakódok -20000 és -20999 között kell hogy legyenek.)
Enélkül csak a WHEN OTHERS résszel tudnánk lekezelni az alprogram hibáit, és így nem tudnánk megállapítani a hiba fajtáját.
A WHEN OTHERS ágban használható pszeudóváltozók:
SQLCODE: kiírathatjuk a kivétel kódját
SQLERRM: kiírathatjuk a hibát