Основы (асослар)
Сўровостилардан фойдаланиш
Download 0.95 Mb.
|
PL-SQL Маъруза матни
- Bu sahifa navigatsiya:
- Ошкормас курсорлар
- Курсорларни пакетларда бирлаштириш
- FOR Loops курсоридан фойдаланиш
Сўровостилардан фойдаланишКурсорларда сўровостилардан фойдаланиш мумкин: Мисол 1. DECLARE CURSOR c1 IS SELECT empno, ename FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE loc <> 'CHICAGO'); Мисол 2.
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.
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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling