Эълон қилиш қисмида мустасноларнинг содир этилиши
Эълон қилиш қисмида мустаснолар фақат қиймат бериш жараёнида содир этилиши мумкин. Масалан қуйидаги эълон қилиш қисмида мустасно содир этилади, чунки credit_limit ўзгармас 999 катта бўлган сонни сақлаб билмайди:
DECLARE
credit_limit CONSTANT NUMBER(3) := 5000; -- мустасно содир этилади
BEGIN
...
EXCEPTION
WHEN OTHERS THEN – мустаснони ушлаб билмайди
...
END;
Жорий блокдаги ишлов берувчилар содир этилган мустаснони ушлаб билмайди, чунки эълон қилиш қисмида содир этилган мустаснолар ўша заҳотиёқ ташқи блокга тарқалади.
Ишлов берувчида содир этилган мустаснолар
Бир вақтда фақат битта мустасно актив бўлиши мумкин холос, шу сабали ишлов берувчининг ичида содир этилган мустасно ўша заҳотиёқ ташқи блокга тарқалади ва янги содир этилган мустасно учун ишлов берувчини излайди:
EXCEPTION
WHEN INVALID_NUMBER THEN
INSERT INTO ... -- DUP_VAL_ON_INDEX мустасно содир бўлиши мумкин
WHEN DUP_VAL_ON_INDEX THEN ... – мустаснони ушлаб билмайди
END;
Мустаснога ишлов берувчидан чиқиш ва унга кириш
GOTO жумласи ёрдамида мустаснога ишлов берувчи қисмига кириш мумкин эмас. statement cannot branch into an exception handler. GOTO жумласи ёрдамида ишлов берувчи қисмидан жорий блокга ўтиш ҳам мумкин эмас:
DECLARE
pe_ratio NUMBER(3,1);
BEGIN
DELETE FROM stats WHERE symbol = 'XYZ';
SELECT price / NVL(earnings, 0) INTO pe_ratio FROM stocks
WHERE symbol = 'XYZ';
<>
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio);
EXCEPTION
WHEN ZERO_DIVIDE THEN
pe_ratio := 0;
GOTO my_label;-- жорий блокга нотўғри ўтиш END;
SQLCODE ва SQLERRM фойдаланиш
Мустаснога ишлов бериш қисмида SQLCODE ва SQLERRM функцияларидан қандай хатолик юз берганини ва у билан боғланган хатолик матнини топиш учун фойдаланиш мумкин. Ички хатоликлар учун SQLCODE функцияси Oracle хатолиги номерини қайтаради. Агар Oracle хатолиги no data found бўлса SQLCODE функцияси +100 ва бошқа барча ҳолларда манфий соннни қайтаради. SQLERRM функцияси эса мос хатолик хабарини қайтаради. The message begins with the Oracle error code.
Фойдаланувчи томонидан аниқланган мустаснолар учун SQLCODE функцияси +1 ва SQLERRM функцияси қуйидаги хабарни қайтаради:
User-Defined Exception
Агар мустасно номи EXCEPTION_INIT прагма орқали Oracle хатолиги номери билан боғланган бўлса, SQLCODE функцияси хатолик номерини қайтаради ва SQLERRM функцияси эса мос хатолик хабарини қайтаради. The maximum length of an Oracle хатолиги хабарининг максимал узунлиги error message is 512 белгидан иборат бўлиши мумкин. Агар мустасно содир бўлмаса, SQLCODE функцияси нол қиймат қайтаради ва SQLERRM функцияси
ORA-0000: normal, successful completion
хабарни қайтаради. Oracle барча хатоликлар хабарларини қуйидаги дастур ёрдамида кўриш мумкин
DECLARE
...
err_msg VARCHAR2(100);
BEGIN
/* Get all Oracle error messages. */
FOR err_num IN 1..9999 LOOP
err_msg := SQLERRM(-err_num);
INSERT INTO errors VALUES (err_msg);
END LOOP;
END;
SQLCODE ва SQLERRM функцияларини бевосита SQL жумлалрида ишлатиш мумкин эмас, балки уларни аввал локал ўзгарувчида олиб, сўнг ишлатиш мумкин:
DECLARE
err_num NUMBER;
err_msg VARCHAR2(100);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
err_num := SQLCODE;
err_msg := SUBSTR(SQLERRM, 1, 100);
INSERT INTO errors VALUES (err_num, err_msg);
END;
Do'stlaringiz bilan baham: |