Фойдаланувчи томонидан аниқланган мустаснолар
PL/SQL фойдаланувчига ўзининг мустасносини эълон қилишга имкон беради. Олдиндан аниқланган мустаснодан фарқли равишда фойдаланувчи томонидан аниқланган мустаснолар эълон қилиниши лозим ва RAISE жумласи ёрдамида ошкор тарзда содир этилиши шарт.
Мустасноларни эълон қилиш
Мустасноларни PL/SQL блоки, қисмпрограммаси ёки пакетнинг эълон қилиш қисмида эълон қилиш мумкин холос. Мустаснони унинг номини киритиш ва EXCEPTION таянч хизматчи сўз билан давом этириш лозим. Масалан:
DECLARE
past_due EXCEPTION;
Эълон қилиш қоидалари
Битта блокнинг ичида мустаснони икки марта эълон қилиш мумкин эмас. Аммо битта мустаснони иккита ҳар хил блокларда эълон қилиш мумкин ва уларга масалан қуйидагича мурожаат қилиш мумкин:
Блок_меткаси.мустасно_номи
Қуйидаги мисол битта мустаснони иккита ҳар хил блокларда эълон қилиш мумкинлигини намойиш этади:
DECLARE
past_due EXCEPTION;
acct_num NUMBER;
BEGIN
DECLARE -- қисм-блок бошланиши
past_due EXCEPTION; -- эълон қилиш prevails
acct_num NUMBER;
BEGIN
...
IF ... THEN
RAISE past_due; -- бунга ишлов берилмайди
END IF;
END; ------------- қисм-блок охири
EXCEPTION
WHEN past_due THEN -- содир этилган мустаснога ишлов берилмайди
...
END;
Охирги блокдаги мустаснога ишлов бериш қисми ишланмайди, чунки past_due мустаснонинг содир этиш ички блокда юз бериб, унда ищлов бериш қисми (ички блок ичида)мавжуд эмас. Бу ерда RAISE жумласи ва WHEN жумласи ҳар хил мустасноларга мурожаат қилаяпти. Охирги блокдаги мустаснога ишлов бериш қисми ишлаши учун past_due мустаснонинг эълон қилиш қисмини ички блокдан олиб ташлаш лозим ёки OTHERS ишлов бериш қисмини киритиш керак.
EXCEPTION_INIT фойдаланиш
Номланмаган ички мустасноларга ищлов бериш учун OTHERS ишлов берувчидан ёки EXCEPTION_INIT прагмадан фойдаланишингиз мумкин. Прагма – бу компиляторга директива бўлиб хизмат қилади.
PL/SQL-да EXCEPTION_INIT прагмаси мустасно номини Oracle хатолиги номери билан боглашга компиляторга кўрсатма беради. Бу эса ўз навбатида ихтиёрий ички мустаснога унинг номи орқали мурожаат қилишга ва унга ишлов берувчи ёзишга имкон беради. EXCEPTION_INIT прагмаси қуйидаги синтаксисга эга:
PRAGMA EXCEPTION_INIT(мустасно_номи, Oracle_хатолиги_номери);
Бу ерда мустасно_номи олдин эълон қилинган мустаснонинг номи. Прагма мустасно эълон қилингандан сўнг ихтиёрий жойда келиши мумкин. Масалан:
DECLARE
deadlock_detected EXCEPTION;
PRAGMA EXCEPTION_INIT(deadlock_detected, -60);
BEGIN
...
EXCEPTION
WHEN deadlock_detected THEN
-- хатолик ишлов берилади
END;
Do'stlaringiz bilan baham: |