Основы (асослар)
Download 0.95 Mb.
|
PL-SQL Маъруза матни
- Bu sahifa navigatsiya:
- Транзакцияни қайта бажариш
Фойдали усулларУшбу бўлимда қулайлик туғдирадиган учта усул билан танишасиз: Мустасно содир этилгандан сўнг ишни давом этиришСизга маълумки мустасно содир этилгандан сўнг бошқарув мустаснога ишлов бериш қисмига узатилади ва ундан кейин блок иши тугатилади , яъни жорий блокга қайтишнинг иложи йўқ. Қуйидаги мисолда агарда 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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling