You are on page 1of 20

Eksplicitni i implicitni 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:

Implicitnim kursorima: Delakrisani za sve DML


i PL/SQL SELECT iskaze
Eksplicitnim kursorima: Deklarisanim i
nazvanim od strane programera
Ativni skup

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

Dohvatanje sloga iz kursora


Pointer
Cursor

Nastavi dok nije prazno


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;

Dohvatanje podataka iz kursora


Dohvata trenutne vrijednosti sloga unutar
varijabli
Ukljuuje isti broj varijabli kao i broj kolona
u upitu kursora
Povezuje svaku varijablu sa odgovarajuom
pozicijom kolone u upitu kursora
Sintaksa:
FETCH naziv_kursora INTO[varijabla1, varijabla2, ]
| naziv_sloga];
;

Dohvatanje podataka iz kursora


Primjer:
FETCH emp_cursor INTO v_empno, v_ename;

...
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;
...

Implicitni kursori - FOR LOOP

Implicitno otraranje, dohvatanje i zatvaranje kursora


Slog se implicitno deklarie
FOR naziv_sloga IN naziv_kursora LOOP
iskaz1;
iskaz2;
. . .
END LOOP;

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;

FOR LOOP sa podupitom


U ovom sluaju nije potrebna deklaracija
kursora
Podupit vri deklaraciju slogova koji se
dohvataju, i osigurava podatake iz baze
podataka
BEGIN
FOR emp_record IN (SELECT ename, deptno
FROM
emp) LOOP
-- implicitno otvaranje i dohvatanje slogova
IF emp_record.deptno = 30 THEN
...
END LOOP; -- implicitno zatvaranje kursora
END;

Kursori sa podupitima

Mogue je koritenje i parametara prilikom


otvaranja i izvravanja upita u kursoru
Parametri osiguravaju da se prilikom otvaranja
eksplicitnih kursora svaki put izvrava upit na
razliit nain
CURSOR naziv_kursora
[(naziv_parametra datatype, ...)]
IS
select_iskaz;
DECLARE
CURSOR emp_cursor
(p_deptno NUMBER, p_job VARCHAR2) IS
SELECT
empno, ename
FROM
emp
WHERE
deptno = p_deptno
AND
job = p_job;
BEGIN
OPEN emp_cursor(10, 'CLERK');
...

FOR UPDATE klauzula

Eksplicitno zakljuavanje sloga za odbijanje


pristupa nad zakljuanim slogovima tokom
trajanja transakcije
Koristi se za zakljuavanje slogova prije
auriranja ili brisanja
Sintaksa:
SELECT ...
FROM
...
FOR UPDATE [OF column_reference][NOWAIT];

Primjer
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename, sal
FROM
emp
WHERE deptno = 30
FOR UPDATE OF sal NOWAIT;

WHERE CURRENT OF klauzula

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:

Implicitni - koristi se za sve DML iskaze i upite jednog


reda
Eksplicitni - koristi se za upite nula, jednog ili vie
slogova)

Mogue je izvrtiti i parametrizaciju kursora i


osigurati razliite naine dohvatanja aktivnog skupa
podataka
Mogue je definisati kursore bez prethodne
deklaracije
Moe se manipulisati eksplicitnim kursorima putem
naredbi:
FOR UPDATE klauzule
WHERE CURRENT OF klauzule

Eksplicitni i implicitni kursori

You might also like