Kurzor v Oracle
Popis
Príkaz jazyka SQL
Oracle implementuje z hľadiska rolovania iba dopredný (jednosmerný) kurzor týchto dvoch druhov:
- Excplicitný – pre tento typ je nutné pre prácu s kurzorom zadať deklaračný príkaz a otvoriť kurzor; nasleduje načítanie dát a zatvorenie kurzoru
- Implicitný – kurzor sa deklaruje a vykonáva priamo v tele programu. Pre implicitný kurzor sú povolené iba tie príkazy, ktoré vracajú jeden alebo žiadne riadky. (SELECT, INSERT, UPDATE, DELETE)
Explicitné kurzory
Základná syntax pre explicitný kurzor:
DECLARE CURSOR <cursorname> IS <query>
Otvorenie
OPEN cursorname
Čítanie z kurzora
FETCH <cursorname> INTO Variable1, Variable2,...
Zatvorenie kurzora
CLOSE <cursorname>
Príklad pre explicitný kurzor:
DECLARE
NAME VARCHAR2(10);
CURSOR cur_Student IS SELECT Name FROM Student;
BEGIN
OPEN cur_Student;
FETCH cur_Student INTO NAME;
FETCH cur_Student INTO NAME;
CLOSE cur_Student
END;
NAME VARCHAR2(10);
CURSOR cur_Student IS SELECT Name FROM Student;
BEGIN
OPEN cur_Student;
FETCH cur_Student INTO NAME;
FETCH cur_Student INTO NAME;
CLOSE cur_Student
END;
Príklad použitia kurzora v cykle:
DECLARE
NAME VARCHAR (10);
CURSOR cur_Student IS
SELECT ID, Name FROM Student;
BEGIN
FOR row IN cur_Student LOOP
IF row.Name = ‘JANO’ THEN
UPDATE Student SET Name = ‘JANKO’
WHERE ID = row.ID;
END IF;
END LOOP;
END;
NAME VARCHAR (10);
CURSOR cur_Student IS
SELECT ID, Name FROM Student;
BEGIN
FOR row IN cur_Student LOOP
IF row.Name = ‘JANO’ THEN
UPDATE Student SET Name = ‘JANKO’
WHERE ID = row.ID;
END IF;
END LOOP;
END;
Poznámka: V cykle sú implicitne ovládané príkazy OPEN, FETCH, CLOSE
Implicitné kurzory
Syntax pre implicitný kurzor je:
Dátové typy stĺpca a premennej musia byť zhodné svojím typom ako aj dĺžkou.
Implicitný kurzor SELECT musí vracať iba jeden riadok. Ak vracia viac riadkov, musí sa použiť explicitný kurzor.
Príklad implicitného kurzora:
Atribúty kurzora
Informácia o stave kurzora sa uchováva v štyroch atribútoch. Každý atribút sa priraďuje k danému kurzoru pomocou mena kurzora a mena atribútu.
cursorname%FOUND | Tento atribút je true ak sa načítal riadok pri poslednom príkaze FETCH, inak má hodnotu false |
cursorname%NOTFOUND | Opak atribútu %FOUND. |
cursorname%ISOPEN | Atribút má hodnotu true ak kurzor bol otvorený, inak false |
cursorname%ROWCOUNT | Atribút nesie informáciu o počte doposiaľ načítaných riadkov. V príkaze update má atribút SQL%ROWCOUNT hodnotu rovnú počtu aktualizovaných riadkov. |
Príklad použitia atribútov:
DECLARE
NAME VARCHAR(10);
CURSOR cur_Student IS SELECT Name FROM Student;
BEGIN
OPEN cur_Student;
FETCH cur_Student INTO NAME;
IF cur_Student%FOUND THEN
FETCH cur_Student INTO NAME;
END IF;
CLOSE cur_Student
END;
NAME VARCHAR(10);
CURSOR cur_Student IS SELECT Name FROM Student;
BEGIN
OPEN cur_Student;
FETCH cur_Student INTO NAME;
IF cur_Student%FOUND THEN
FETCH cur_Student INTO NAME;
END IF;
CLOSE cur_Student
END;
Pozri aj
SQL kurzor