Ички мустаснолар ва EXCEPTION_INIT орқали Oracle хатолиги номери билан боғланган, фойдаланувчи томонидан аниқланган мустаснолар ошкормас тарзда тизим ишлаши жараёнида содир этилади. Аммо фойдаланувчи томонидан аниқланган бошқа мустаснолар RAISE жумласи орқали ошкор тарзда содир этилиши лозим.
RAISE жумласидан фойдаланиш
Берилган мустасно учун RAISE жумласини мустасно аниқланган блокнинг ихтиёрий жойида ишлатишингиз мумкин:
DECLARE
out_of_stock EXCEPTION;
number_on_hand NUMBER(4);
BEGIN
...
IF number_on_hand < 1 THEN
RAISE out_of_stock;
END IF;
EXCEPTION
WHEN out_of_stock THEN
-- хатолик ишлов берилади
END;
Олдиндан аниқланган мустаснони ошкор тарзда ҳам содир этишингиз мумкин:
DECLARE
acct_type INTEGER;
BEGIN
...
IF acct_type NOT IN (1, 2, 3) THEN
RAISE INVALID_NUMBER; /* Олдиндан аниқланган мустасно ошкор тарзда содир этиляпти*/
END IF;
EXCEPTION
WHEN INVALID_NUMBER THEN
ROLLBACK;
...
END;
Мустаснолар қандай тарқалади
Мустасно содир этилиши билан, агар PL/SQL унга ишлов берувчини жорий блок ёки қисмдастурда тополмаса, мустасно тарқалади. Бу эса шуни англатадики, мустасно ташқи блокдан то охирги блокга қадар ишлов берувчини излайди. Агар изланиш муваффақиятсиз тугаса, унда PL/SQL ишлов берилмаган мустасно хатолигини хост муҳитга қайтаради.
Расм. Тарқалиш қоидалари: 1 мисол
Расм. Тарқалиш қоидалари: 2 мисол
Расм. Тарқалиш қоидалари: 3 мисол
Мустасно фақат ўзи эълон қилинган блок миқёсида тарқалиши мумкин холос. Қуйидаги мисолни кўрамиз:
BEGIN
...
DECLARE ---------- қисм-блок боши
past_due EXCEPTION;
BEGIN
...
IF ... THEN
RAISE past_due;
END IF;
END; ------------- қисм-блок охири
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
END;
Past_due мустасно эълон қилинган блокда уни ишлов берувчиси мавжуд эмас ва шу сабабли у навбатдаги блокга тарқалади. Лекин, мустаснони таъсир қилиш қоидаларига асосан, охирги блок қисм-блокда эълон қилингин мустаснога мурожаат қилиб билмайди. Щу сабабли фақат OTHERS ищлов берувчиси ушбу мустаснони ушлаши мумкин.
Do'stlaringiz bilan baham: |