Основы (асослар)


Download 0.95 Mb.
bet42/58
Sana28.12.2022
Hajmi0.95 Mb.
#1011518
1   ...   38   39   40   41   42   43   44   45   ...   58
Bog'liq
PL-SQL Маъруза матни

Фойдали усуллар


Ушбу бўлимда қулайлик туғдирадиган учта усул билан танишасиз:

Мустасно содир этилгандан сўнг ишни давом этириш


Сизга маълумки мустасно содир этилгандан сўнг бошқарув мустаснога ишлов бериш қисмига узатилади ва ундан кейин блок иши тугатилади , яъни жорий блокга қайтишнинг иложи йўқ. Қуйидаги мисолда агарда SELECT INTO жумласида ZERO_DIVIDE содир бўлса, сиз INSERT жумласини ишлатолмайсиз:
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
...
END;

Ушбу мисолдаги муаммони қуйидагича ҳал қилиш мумкин::


DECLARE
pe_ratio NUMBER(3,1);
BEGIN
DELETE FROM stats WHERE symbol = 'XYZ';
BEGIN ---------- қисм-блок боши
SELECT price / NVL(earnings, 0) INTO pe_ratio FROM stocks
WHERE symbol = 'XYZ';
EXCEPTION
WHEN ZERO_DIVIDE THEN
pe_ratio := 0;
END; ---------- қисм-блок охири
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio);
EXCEPTION
WHEN OTHERS THEN
...
END;

Ушбу мисолда агар SELECT INTO жумласи ZERO_DIVIDE мустаснони содир этса, локал ишлов берувчи уни ушлаб олади ва pe_ratio нол қиймат беради. Ишлов берувчи ўз ишини тугатади ва иш INSERT жумласи билан давом этирилади.


Транзакцияни қайта бажариш


Агар мабода бирор сабабга кўра транзакциянгиз бажарилмай қолса, сиз уни қуйидаги мисолда кўрсатилган усулда қайта бажаришга уриниб кўришингиз мумкин:
DECLARE
name VARCHAR2(20);
ans1 VARCHAR2(3);
ans2 VARCHAR2(3);
ans3 VARCHAR2(3);
suffix NUMBER := 1;
BEGIN
...
LOOP /* буни ўрнига FOR i IN 1..10 LOOP бўлиши мумкин, унда ўнта уринишга имконият берилади */
BEGIN --қисм-блок боши
SAVEPOINT start_transaction; /* қайтиш
нуқтасини белгилаш */
DELETE FROM results WHERE answer1 = 'NO';
INSERT INTO results VALUES (name, ans1,
ans2, ans3);
/* DUP_VAL_ON_INDEX содир этиши
мумкин, агар номлар бир хил бўлса */
COMMIT;
EXIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
ROLLBACK TO start_transaction;
/* асл ҳолатга қайтиш*/
suffix := suffix + 1;
/*муаммони ҳал этишга уриниш*/
name := name || TO_CHAR(suffix);
END; -- қисм-блок охири
END LOOP;
END;

Download 0.95 Mb.

Do'stlaringiz bilan baham:
1   ...   38   39   40   41   42   43   44   45   ...   58




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling