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


Сўровостилардан фойдаланиш


Download 0.95 Mb.
bet26/58
Sana28.12.2022
Hajmi0.95 Mb.
#1011518
1   ...   22   23   24   25   26   27   28   29   ...   58
Bog'liq
PL-SQL Маъруза матни

Сўровостилардан фойдаланиш


Курсорларда сўровостилардан фойдаланиш мумкин:
Мисол 1.
DECLARE
CURSOR c1 IS SELECT empno, ename FROM emp
WHERE deptno IN (SELECT deptno FROM dept
WHERE loc <> 'CHICAGO');

Мисол 2.
DECLARE


CURSOR c1 IS SELECT t1.deptno, dname, "STAFF"
FROM dept t1, (SELECT deptno, COUNT(*) "STAFF"
FROM emp GROUP BY deptno) t2
WHERE t1.deptno = t2.deptno AND "STAFF" >= 5;

Мисол 3.
DECLARE


CURSOR c1 IS SELECT deptno, ename, sal FROM emp t
WHERE sal > (SELECT AVG(sal) FROM emp WHERE t.deptno = deptno)
ORDER BY deptno;

Ошкормас курсорлар


Oracle ҳар бир SQL жумласини бажариш учун ошкормас тарзда курсор очади. Аммо OPEN, FETCH, ва CLOSE жумлалари ёрдамида SQL курсорларини бошқариб бўлмайди.

Курсорларни пакетларда бирлаштириш


Пакетда курсор аниқланиши ва танасини алоҳида ажратишингиз мумкин. Пакетдаги курсорнинг аниқланиши синтаксиси қуйидагича:
CURSOR курсор_номи [(параметр[,параметр]...)] RETURN қайтариш_тури;

Курсор аниқланишида %ROWTYPE фойдалани мумкин:


CREATE PACKAGE emp_actions AS
/* Курсор аниқланиш соҳасини эълон қилиш */
CURSOR c1 RETURN emp%ROWTYPE;
...
END emp_actions;

CREATE PACKAGE BODY emp_actions AS


/* Курсор танасини эълон қилиш */
CURSOR c1 RETURN emp%ROWTYPE IS
SELECT * FROM emp
WHERE sal > 3000;
...
END emp_actions;

Келажакда курсор аниқланишини ўзгартирмасдан туриб уни танасини ўзгартиришингиз мумкин:


CREATE PACKAGE BODY emp_actions AS
/* Курсор танасини эълон қилиш */
CURSOR c1 RETURN emp%ROWTYPE IS
SELECT * FROM emp
WHERE deptno = 20; -- янги WHERE жумласи ...
END emp_actions;


FOR Loops курсоридан фойдаланиш


Кўп ҳолларда курсорни ошкор тарзда эълон қилишда OPEN, FETCH ва CLOSE жумлалари ўрнига FOR Loop курсоридан фойдаланишингиз мумкин. FOR loop цикл индексини %ROWTYPE ёзув кўринишида ошкормас тарзда эълон қилиб, курсорни очади, қаторларни кетма-кет суғуриб ёзувга олади ва барча қаторлар олингандан сўнг курсорни ёпади:
DECLARE
result temp.col1%TYPE;
CURSOR c1 IS
SELECT n1, n2, n3 FROM data_table WHERE exper_num = 1;
BEGIN
FOR c1_rec IN c1 LOOP
/* ҳисоблайди ва натижаларни сақлайди*/
result := c1_rec.n2 / (c1_rec.n1 + c1_rec.n3);
INSERT INTO temp VALUES (result, NULL, NULL);
END LOOP;
COMMIT;
END;

ёзув фақат циклнинг ичида аниқланган холос ва унинг майдонларига циклдан ташқарида мурожаат қилиб бўлмайди:


FOR c1_rec IN c1 LOOP
...
END LOOP;
result := c1_rec.n2 + 3; -- қоидага хилоф



Download 0.95 Mb.

Do'stlaringiz bilan baham:
1   ...   22   23   24   25   26   27   28   29   ...   58




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