Основы (асослар)
Эълон қилиш қисмида мустасноларнинг содир этилиши
Download 0.95 Mb.
|
PL-SQL Маъруза матни
- Bu sahifa navigatsiya:
- Ишлов берувчида содир этилган мустаснолар
- Мустаснога ишлов берувчидан чиқиш ва унга кириш
- SQLCODE ва SQLERRM фойдаланиш
Эълон қилиш қисмида мустасноларнинг содир этилишиЭълон қилиш қисмида мустаснолар фақат қиймат бериш жараёнида содир этилиши мумкин. Масалан қуйидаги эълон қилиш қисмида мустасно содир этилади, чунки 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; Download 0.95 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling