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


Download 0.95 Mb.
bet48/58
Sana28.12.2022
Hajmi0.95 Mb.
#1011518
1   ...   44   45   46   47   48   49   50   51   ...   58
Bog'liq
PL-SQL Маъруза матни

Конструктор методлари


Хар бир объект тури тизим томонидан аниқланган функция - конструктор методига (қисқача конструктор) эга, унинг номи объект турининг номи билан устма – уст тушади. Сиз конструкторни объект тури нусхасини тўлдириш ва қайтариш учун ишлатасиз.

Объект турларини аниқлаш


Объект тури қуйидагича аниқланади:
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:
1   ...   44   45   46   47   48   49   50   51   ...   58




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