Professional Documents
Culture Documents
3 Kursori
3 Kursori
Ciljevi
Poslije kompletiranja ove lekcije trebalo bi
se moi:
Praviti razlika izmeu implicitnog i
eksplicitnog kursora
Koristiti PL/SQL record varijabla
Napisati kursor sa FOR LOOP sintaksom
Kursori
Svaki SQL iskaz koji se izvrava od strane
Oracle servera posjeduje individualni
kursor povezan sa:
Kursor
7369
7566
7788
7876
7902
SMITH CLERK
JONES MANAGER
SCOTT ANALYST
ADAMS
CLERK
FORD ANALYST
Trenutni slog
Eksplicitni kusori
Ne
Da
DECLARE
Kreiranje
PL/SQL
kursora
OPEN
Identifikacija
aktivnog
skupa
podataka
FETCH
Uitavanje
trenutnog
sloga u
varijablu
EMPTY?
Testiranje
postojeih
slogova
CLOSE
Oslobaanje
kursora i
aktivnog
Povratak na skupa
podataka
FETCH
klauzulu ako
je slog
dohvaen
Eksplicitni kursori
Otvaranje kursora
Pointer
Cursor
Zatvori kursor
Deklaracija kursora
Nije ukljuena INTO klauzula unutra
deklaracije kursora
Ako se zahtjeva odreeni poredak slogova u
kursoru, za to se moe koristiti i ORDER BY
klauzula da se napravi odreeni poredak u
DECLARE
upitu kursora
CURSOR emp_cursor IS
Sintaksa:
SELECT empno, ename
CURSOR naziv_kursora IS
select_iskaz;
FROM
emp;
CURSOR dept_cursor IS
SELECT *
FROM
dept
WHERE deptno = 10;
BEGIN
...
Otvaranje kursora
Otvaranje kursora podrazumijeva
izvravanje upita i kreiranje aktivnog skupa
podataka spremnih za rad
Ako upit nije dohvatio ni jedan slog nee se
desiti nikakav izuzetak
Koritenjem kursorskih atributa mogue je
provjeriti stanje kursora kao i dohvaenih
podataka iz upita
Sintaksa:
OPEN
naziv_kursora;
...
OPEN defined_cursor;
LOOP
FETCH defined_cursor INTO defined_variables
EXIT WHEN ...;
...
-- Proces dohvatanja podataka iz kursora
...
END;
Zatvaranje kursora
Zatvaranje kursora podrazumijeva
kompletiranje procesa dohvatanja slogova
Mogue je ponovo otvoriti kursor, ako je
potrebno
Nije mogue ponovo izvriti FETCH
komandu nad kursorom koji je prethodno
zatvoren, osim ako se ponovo ne otvori
CLOSE
naziv_kursora;
%IsOpen atribut
Dohvatanje slogova iz baze u okviru krusora
mogue je izvriti samo u sluaju kada je
kursor otvoren
Prije otvaranja kursora poeljno je izvrti
%IsOpen provjeru
Primjer:
IF NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor;
END IF;
LOOP
FETCH emp_cursor...
Kursori i slogovi
Zbog jednostavnosti koda i broja varijabli koje
je potrebno deklarisati prilikom izvravanja
kursora i dohvatanja vrijednosti u
odgovarajue varijable, bolja praksa je koristiti
slog tipa kursor kao to je dat u sljedeem
primjeru:
DECLARE
CURSOR emp_cursor IS
SELECT
empno, ename
FROM
emp;
emp_record emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_record;
...
DECLARE
CURSOR emp_cursor IS
SELECT ename, deptno
FROM
emp;
BEGIN
FOR emp_record IN emp_cursor LOOP
-- implicitno otvaranje i dohvtanje slogova
IF emp_record.deptno = 30 THEN
...
END LOOP; -- implicitno zatvaranje kursora
END;
Kursori sa podupitima
Primjer
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename, sal
FROM
emp
WHERE deptno = 30
FOR UPDATE OF sal NOWAIT;
Koristi se kursor za
auriranje ili
brisanje trenutnog
sloga
Ukljuuje FOR
UPDATE klauzulu
u kursorskom upitu
da prvo zakljua
slogove
Upotrebljava se
WHERE CURRENT
OF klauzula da se
referenceira na
tenutni slog u
eksplicitnom
kursoru
DECLARE
CURSOR sal_cursor IS
SELECT
sal
FROM
emp
WHERE
deptno = 30
FOR UPDATE OF sal NOWAIT;
BEGIN
FOR emp_record IN sal_cursor LOOP
UPDATE
emp
SET sal = emp_record.sal * 1.10
WHERE CURRENT OF sal_cursor;
END LOOP;
COMMIT;
END;
Kursori sa podupitima
Primjer:
DECLARE
CURSOR my_cursor IS
SELECT t1.deptno, t1.dname, t2.STAFF
FROM
dept t1, (SELECT deptno,
count(*) STAFF
FROM
emp
GROUP BY deptno) t2
WHERE t1.deptno = t2.deptno
AND
t2.STAFF >= 5;
...
BEGIN
OPEN ...
FETCH ...
CLOSE ...
END; ...
Kratak pregled
Vrste kursora: