Mi az a kivételkezelés PL / SQL-ben?
Kivétel akkor fordul elő, amikor a PL / SQL motor olyan utasítással találkozik, amelyet a futás közben bekövetkező hiba miatt nem tud végrehajtani. Ezeket a hibákat az összeállítás idején nem rögzítjük, ezért csak a futás idején kellett kezelni őket.
Például, ha a PL / SQL motor utasítást kap, hogy tetszőleges számot osszon el „0” -val, akkor a PL / SQL motor kivételként dobja. A kivételt csak futás közben vetíti fel a PL / SQL motor.
A kivételek meggátolják a program további futtatását, így az ilyen állapot elkerülése érdekében külön kell rögzíteni és kezelni őket. Ezt a folyamatot Exception-Handling-nek hívják, amelyben a programozó kezeli a futáskor előforduló kivételt.
Ebben az oktatóanyagban a következő témákat ismerheti meg:
- Kivételkezelő szintaxis
- Kivétel típusai
- Előre definiált kivételek
- Felhasználó által meghatározott kivétel
- PL / SQL kivétel emelése
- Fontos megjegyzendő pontok a Kivétel részben
Kivételkezelő szintaxis
A kivételeket a blokk szintjén kezeljük, azaz ha valamelyik blokkban bármilyen kivétel lép fel, akkor a vezérlés a blokk végrehajtási részéből kerül ki. A kivételt ezután a blokk kivételkezelő részében kezeljük. A kivétel kezelése után nem lehet újból visszaküldeni a vezérlést az adott blokk végrehajtási szakaszába.
Az alábbi szintaxis elmagyarázza a kivétel elkapásának és kezelésének módját.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Szintaxis Magyarázat:
- A fenti szintaxisban a kivételkezelő blokk WHEN feltételsorozatot tartalmaz a kivétel kezelésére.
- Minden WHEN feltételt követ a kivétel neve, amely várhatóan fel fog emelkedni a futási időben.
- Amikor futás közben bármilyen kivétel merül fel, akkor a PL / SQL motor a kivételkezelő részben keresi az adott kivételt. Ez az első „WHEN” záradéktól indul, és egymás után fog keresni.
- Ha megtalálja a felvetett kivétel kezelését, akkor végrehajtja az adott kezelési kódot.
- Ha a „WHEN” záradék egyike sem szerepel a felvetett kivételnél, akkor a PL / SQL motor végrehajtja a „WHEN OTHERS” részt (ha van). Ez minden kivételnél általános.
- A kivétel végrehajtása után az alkatrészvezérlés kimegy az aktuális blokkból.
- Csak egy kivételt lehet végrehajtani egy blokkhoz futás közben. A végrehajtás után a vezérlő kihagyja a fennmaradó kivételkezelő részt, és kimegy az aktuális blokkból.
Megjegyzés: AMIKOR MÁSOK mindig a sorozat utolsó helyén kell lenniük. A WHEN OTHERS után megjelenő kivételkezelő részt soha nem hajtják végre, mivel a vezérlés a WHEN OTHERS végrehajtása után kilép a blokkból.
Kivétel típusai
Kétféle kivétel létezik a Pl / SQL-ben.
- Előre definiált kivételek
- Felhasználó által meghatározott kivétel
Előre definiált kivételek
Az Oracle előre definiált néhány általános kivételt. Ezeknek a kivételeknek egyedi kivételnevük és hibaszámuk van. Ezeket a kivételeket már meghatározta az Oracle 'STANDARD' csomagja. A kódban ezeket az előre definiált kivételneveket közvetlenül kezelhetjük.
Az alábbiakban néhány előre meghatározott kivétel szerepel
Kivétel | Hibakód | Kivétel oka |
ACCESS_INTO_NULL | ORA-06530 | Rendeljen értéket az inicializálatlan objektumok attribútumaihoz |
CASE_NOT_FOUND | ORA-06592 | A CASE utasításban szereplő „WHEN” záradék egyikének sem felel meg, és nincs meghatározva „ELSE” záradék |
COLLECTION_IS_NULL | ORA-06531 | Gyűjtési módszerek (az EXISTS kivételével) vagy a gyűjteményattribútumok elérése egy inicializálatlan gyűjteményen |
CURSOR_ALREADY_OPEN | ORA-06511 | Megpróbál megnyitni egy már nyitott kurzort |
DUP_VAL_ON_INDEX | ORA-00001 | Ismétlődő érték tárolása az adatbázis oszlopában, amelyet egyedi index korlátoz |
INVALID_CURSOR | ORA-01001 | Az illegális kurzorműveletek, például egy nyitatlan kurzor bezárása |
ÉRVÉNYTELEN SZÁM | ORA-01722 | A karakter számokká alakítása érvénytelen számkarakter miatt nem sikerült |
NEM TALÁLHATÓ ADAT | ORA-01403 | Amikor az INTO záradékot tartalmazó 'SELECT' utasítás nem keres sorokat. |
ROW_MISMATCH | ORA-06504 | Ha a kurzor változó adattípusa nem kompatibilis a kurzor tényleges visszatérési típusával |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Gyűjtemény hivatkozása a gyűjtemény méreténél nagyobb indexszámmal |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | A gyűjtemény hivatkozása olyan indexszámmal, amely kívül esik a törvényes tartományon (pl .: -1) |
TOO_MANY_ROWS | ORA-01422 | Amikor egy 'SELECT' utasítás INTO záradékkal több sort ad vissza |
VALUE_ERROR | ORA-06502 | Számtani vagy méretkorlátozási hiba (pl .: a változó méreténél nagyobb változóhoz értéket rendelünk) |
ZERO_DIVIDE | ORA-01476 | Szám elosztása „0” -val |
Felhasználó által meghatározott kivétel
Az Oracle-ben, a fent definiált kivételektől eltekintve, a programozó létrehozhat saját kivételt és kezelheti azokat. Alprogramszinten hozhatók létre a deklarációs részben. Ezek a kivételek csak abban az alprogramban láthatók. A csomagspecifikációban meghatározott kivétel nyilvános kivétel, és bárhol látható, ahol a csomag elérhető. <
Szintaxis: Alprogram szintjén
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- A fenti szintaxisban a „kivétel_név” változó meghatározása „KIVÉTEL” típusú.
- Ez hasonló módon használható előre definiált kivételként.
Szintaxis: Csomag specifikáció szinten
CREATE PACKAGEIS EXCEPTION;… END ;
- A fenti szintaxisban a „kivétel_név” változó „KIVÉTEL” típusúként definiálva van a
csomag specifikációban. - Ez felhasználható az adatbázisban, bárhova hívható a 'package_name' csomag.
PL / SQL kivétel emelése
Az összes előre definiált kivétel implicit módon felmerül, amikor a hiba bekövetkezik. De a felhasználó által meghatározott kivételeket kifejezetten fel kell emelni. Ez a „RAISE” kulcsszóval érhető el. Ez az alábbiakban felsorolt bármely módon felhasználható.
Ha a programban külön használják a „RAISE” elemet, akkor a már felvetett kivételt továbbítja a szülőblokkba. Csak kivételesen használható blokk az alábbiak szerint.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Szintaxis Magyarázat:
- A fenti szintaxisban a RAISE kulcsszót használják a kivételkezelő blokkban.
- Amikor a program a "kivétel_név" kivétellel találkozik, a kivételt kezeljük, és a szokásos módon befejezzük
- De a kivételkezelő részben szereplő „RAISE” kulcsszó továbbítja ezt a kivételt a szülőprogramba.
Megjegyzés: Miközben a szülőblokkra vonatkozó kivételt felemeli, a növekvő kivételnek a szülőblokknál is láthatónak kell lennie, máskülönben az oracle hibát dob.
- Használhatjuk a 'RAISE' kulcsszót, amelyet a kivétel neve követ, az adott felhasználó által definiált / előre definiált kivétel felvetésére. Ez mind a végrehajtási részben, mind a kivételkezelő részben felhasználható a kivétel felvetésére.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Szintaxis Magyarázat:
- A fenti szintaxisban a RAISE kulcsszót használják a végrehajtási részben, amelyet a "kivétel_név" kivétel követ.
- Ez felveti ezt a kivételt a végrehajtáskor, és ezt tovább kell kezelni vagy fel kell emelni.
1. példa : Ebben a példában megnézzük
- Hogyan lehet kijelenteni a kivételt
- Hogyan lehet felhozni a bejelentett kivételt és
- Hogyan terjesszük a fő blokkba
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:/
Kód Magyarázat:
- 2. kódsor: A „sample_exception” változó deklarálása EXCEPTION típusnak.
- 3. kódsor: A beágyazott_blokk deklarálási eljárása.
- 6. kódsor: Az "Inside nested block" utasítás kinyomtatása.
- 7. kódsor: A "minta_kivétel emelése beágyazott blokkból" utasítás nyomtatása.
- 8. kódsor : A kivétel emelése a „RAISE sample_exception” használatával.
- 10. kódsor : Kivételkezelő a kivétel_minta kivételhez a beágyazott blokkban.
- 11. kódsor: A 'Kivétel beágyazott blokkban elfoglalt utasítás kinyomtatása. Fő blokkra emelés ”.
- 12. kódsor : A kivétel felemelése a fő blokkra (terjed a fő blokkra).
- 15. kódsor: A "Belül a fő blokkban" utasítás nyomtatása.
- 16. kódsor: A "Beágyazott blokk hívása" utasítás nyomtatása.
- 17. kódsor : Nested_block eljárás hívása.
- 19. kódsor : Kivételkezelő a minta_kivételhez a fő blokkban.
- 20. kódsor : A "Kivétel rögzítve a fő blokkban" utasítás nyomtatása.
Fontos megjegyzendő pontok a Kivétel részben
- Funkcióban egy kivételnek mindig vagy vissza kell térnie, vagy tovább kell növelnie a kivételt. különben az Oracle futás közben el fogja dobni a „Function return érték nélkül” hibát.
- A tranzakcióvezérlő utasításokat a kivételkezelő blokkban lehet megadni.
- Az SQLERRM és az SQLCODE a beépített függvények, amelyek megadják a kivétel üzenetet és kódot.
- Ha egy kivételt nem kezelnek, akkor alapértelmezés szerint az adott munkamenet összes aktív tranzakciója visszaáll.
- A RAISE_APPLICATION_ERROR (-
, ) felhasználható a RAISE helyett a hiba feltüntetésére felhasználói kóddal és üzenettel. A hibakódnak nagyobbnak kell lennie, mint 20000, és előtagja: -.
Összegzés
E fejezet után. képesnek kell lennie arra, hogy a Pl SQL-kivételek következő szempontjain dolgozzon
- A kivételek kezelése
- Definiáljon kivételt
- Emelje fel a kivételt
- Kivétel terjedése