Основы (асослар)
Download 0.95 Mb.
|
PL-SQL Маъруза матни
- Bu sahifa navigatsiya:
- Объект турларини аниқлаш
- Стек объект тури
- Банк_ҳисоб_рақами объекти тури
Конструктор методлариХар бир объект тури тизим томонидан аниқланган функция - конструктор методига (қисқача конструктор) эга, унинг номи объект турининг номи билан устма – уст тушади. Сиз конструкторни объект тури нусхасини тўлдириш ва қайтариш учун ишлатасиз. Объект турларини аниқлашОбъект тури қуйидагича аниқланади: CREATE [OR REPLACE] TYPE тур_номи [AUTHID {CURRENT_USER | DEFINER}] {IS | AS} OBJECT ( атрибут_номи берилганлар_тури[,атрибут_номи берилганлар_тури]... [{MAP | ORDER} MEMBER функция_аниқланиши,] [{MEMBER | STATIC} {қисмдастур_аниқланиши | чақириш_аниқланиши} [, {MEMBER | STATIC} { қисмдастур_аниқланиши | чақириш_аниқланиши}]...] ); [CREATE [OR REPLACE] TYPE BODY тур_номи {IS | AS} { {MAP | ORDER} MEMBER функция_танаси; | {MEMBER | STATIC} {қисмдастур_танаси | чақириш_аниқланиши };} [{MEMBER | STATIC} { қисмдастур_танаси | чақириш_аниқланиши };]... END;] AUTHID жумласи барча member методларининг бажарилиши уларни ташкил қилган фойдаланувчи ёки уларни чақирувчи фойдаланувчи имтиёзи орқали амалга оширилишини аниқлаб беради. Чақириш аниқланиши эса Java методи ёки ташқи C функциясини Oracle берилганлар луғатида фойдаланишга имкон беради. Стек объект туриСтек тартиблаштирилган берилганлар майдончалари тўпламини сақлайди. Номидан кўриниб турибтики, стекнинг боши ва охири мавжуд. Аммо майдонларни қўшиш ёки олиб ташлаш бошидан бошланади. Охирги майдон стекга қўшилди деганда, биринчи майдон чиқарилди деб тушуниш лозим (охиргиси кирди, биринчиси чиқди). Стекни жуда кўп жойларда ишлатиш мумкин. Масалан тизимий дастурлашда узилишлар приоритетини ўрнатиш ва рекурсияларни бошқаришда ишлатилади. Уларни бутун қийматли массивларда ҳам ишлатса бўлади. PL/SQL тилида VARRAY, берилганлар тури мавжуд бўлиб, ўзгарувчан ўлчовли массивларни эълон қилишга имкон беради. Varray атрибутини эълон қилиш учун аввал унинг турни аниқлашингиз лозим: CREATE TYPE IntArray AS VARRAY(25) OF INTEGER; Сўнг объект тури аниқланишини ёзишингиз мумкин: CREATE TYPE Stack AS OBJECT ( max_size INTEGER, top INTEGER, position IntArray, MEMBER PROCEDURE initialize, MEMBER FUNCTION full RETURN BOOLEAN, MEMBER FUNCTION empty RETURN BOOLEAN, MEMBER PROCEDURE push (n IN INTEGER), MEMBER PROCEDURE pop (n OUT INTEGER) ); Ниҳоят объект тури танасини ёзишингиз мумкин: CREATE TYPE BODY Stack AS MEMBER PROCEDURE initialize IS BEGIN top := 0; /* Varray учун конструкторни чақиради ва 1-нчи элементига NULL қиймат беради. */ position := IntArray(NULL); max_size := position.LIMIT; /*Varray ўлчовини аниқлайди */ position.EXTEND(max_size - 1, 1); /* 1-нчи элементини 2..25 элементларига нусхалайди */ END initialize; MEMBER FUNCTION full RETURN BOOLEAN IS BEGIN RETURN (top = max_size); /* TRUE қиймат қайтаради, агарда стек тўлган бўлса */ END full; MEMBER FUNCTION empty RETURN BOOLEAN IS BEGIN RETURN (top = 0); /* TRUE қиймат қайтаради, агарда стек бўш бўлса */ END empty; MEMBER PROCEDURE push (n IN INTEGER) IS BEGIN IF NOT full THEN top := top + 1; -- push integer onto stack position(top) := n; ELSE -- стек тўлган RAISE_APPLICATION_ERROR(-20101, стек тўлган'); END IF; END push; MEMBER PROCEDURE pop (n OUT INTEGER) IS BEGIN IF NOT empty THEN n := position(top); top := top - 1; -- pop integer off stack ELSE -- stack is empty RAISE_APPLICATION_ERROR(-20102, 'stack underflow'); END IF; END pop; END; Push ва pop member процедураларида сиз ички қурилган raise_application_error процедурани фойдаланувчи томонидан аниқланган хатолик хабарини мижоз дастурига чиқариш учун ишлатасиз. Мижоз дастури ушбу PL/SQL мустасносини SQLCODE ва SQLERRM хатолик-ҳисоботи функцияларини OTHERS мустаснога ишлов берувчида ишлатишингиз мумкин: DECLARE err_num NUMBER; err_msg VARCHAR2(100); BEGIN ... EXCEPTION WHEN OTHERS THEN err_num := SQLCODE; err_msg := SUBSTR(SQLERRM, 1, 100); DBMS_OUTPUT.PUT_LINE(TO_CHAR(err_num) || ': ' || err_msg); Алтернатив тарзда дастур EXCEPTION_INIT прагмани raise_application_error томонидан қайтарган хатолик рақамларини номланган мустасноларга акслантиришга имкон беради: DECLARE stack_overflow EXCEPTION; stack_underflow EXCEPTION; PRAGMA EXCEPTION_INIT(stack_overflow, -20101); PRAGMA EXCEPTION_INIT(stack_underflow, -20102); BEGIN ... EXCEPTION WHEN stack_overflow THEN ... Банк_ҳисоб_рақами объекти туриБанк ҳисоб рақамини ифодаловчи объект турини аниқлаш учун, лозим бўладиган берилганлар ва амалларни қараб чиқишингиз зарур. Содда банк ҳисоб рақами учун объект тури учун ҳисоб рақами тартиби, баланси ва статус атрибутлари лозим бўлади. Бундан ташқари қуйидаги амалларни бажарувчи методлар ҳам зарур бўлади: ҳисоб рақамини очиш, ҳисоб рақами тартибини текшириш, ҳисоб рақамини ёпиш, депозит пуллари ва балансни қайтарувчи. Аввал сиз объект тури аниқланишини ёзишингиз лозим: CREATE TYPE Bank_Account AS OBJECT ( acct_number INTEGER(5), balance REAL, status VARCHAR2(10), MEMBER PROCEDURE open (amount IN REAL), MEMBER PROCEDURE verify_acct (num IN INTEGER), MEMBER PROCEDURE close (num IN INTEGER, amount OUT REAL), MEMBER PROCEDURE deposit (num IN INTEGER, amount IN REAL), MEMBER PROCEDURE withdraw (num IN INTEGER, amount IN REAL), MEMBER FUNCTION curr_bal (SELF IN OUT Bank_Account, num IN INTEGER) RETURN REAL ); Сўнг объект тури танасини ёзасиз: CREATE TYPE BODY Bank_Account AS MEMBER PROCEDURE open (amount IN REAL) IS -- open account with initial deposit BEGIN IF NOT amount > 0 THEN RAISE_APPLICATION_ERROR(-20104, 'bad amount'); END IF; SELECT acct_sequence.NEXTVAL INTO acct_number FROM dual; status := 'open'; balance := amount; END open; MEMBER PROCEDURE verify_acct (num IN INTEGER) IS -- check for wrong account number or closed account BEGIN IF (num <> acct_number) THEN RAISE_APPLICATION_ERROR(-20105, 'wrong number'); ELSIF (status = 'closed') THEN RAISE_APPLICATION_ERROR(-20106, 'account closed'); END IF; END verify_acct; MEMBER PROCEDURE close (num IN INTEGER, amount OUT REAL) IS -- close account and return balance BEGIN verify_acct(num); status := 'closed'; amount := balance; END close; MEMBER PROCEDURE deposit (num IN INTEGER, amount IN REAL) IS BEGIN verify_acct(num); IF NOT amount > 0 THEN RAISE_APPLICATION_ERROR(-20104, 'bad amount'); END IF; balance := balance + amount; END deposit; MEMBER PROCEDURE withdraw (num IN INTEGER, amount IN REAL) IS -- if account has enough funds, withdraw -- given amount; else, raise an exception BEGIN verify_acct(num); IF amount <= balance THEN balance := balance - amount; ELSE RAISE_APPLICATION_ERROR(-20107, 'insufficient funds'); END IF; END withdraw; MEMBER FUNCTION curr_bal (SELF IN OUT Bank_Account, num IN INTEGER) RETURN REAL IS BEGIN verify_acct(num); RETURN balance; END curr_bal; END; Download 0.95 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling