Kurzory v SQL jsou nßstrojem, jak programov∞ zpracovat odpov∞∩ na dotaz. Umo₧≥ujφ Φφst °ßdky tΘto odpov∞di, modifikovat je nebo ruÜit je. Kurzor je v₧dy nastaven na n∞kterΘ °ßdce odpov∞di, je p°ed n∞kterou °ßdkou nebo za poslednφ °ßdkou odpov∞di.
Lokßlnφ kurzory lze deklarovat v ka₧dΘm slo₧enΘm p°φkazu. Mimo to lze pracovat s globßlnφmi kurzory, kterΘ se dajφ otev°φt do libovolnΘho dotazu ulo₧enΘho v databßzovΘ aplikaci.
Ka₧d² kurzor musφ b²t nejprve otev°en p°φkazem OPEN. PotΘ lze prochßzet a Φφst jeho °ßdky p°φkazem FETCH, odvolßvat se na jeho b∞₧n² zßznam v p°φkazech UPDATE CURRENT OF a DELETE CURRENT OF a nakonec jej uzav°φt p°φkazem CLOSE.
Neuzav°enΘ lokßlnφ kurzory jsou automaticky uzav°eny p°i opuÜt∞nφ slo₧enΘho p°φkazu, v n∞m₧ jsou deklarovßny.
Jin² zp∙sob, jak otev°φt kurzor, projφt a zpracovat postupn∞ vÜechny jeho zßznamy a kurzor uzav°φt, nabφzφ °φdicφ p°φkaz FOR. P°i pou₧itφ FOR nenφ t°eba deklarovat NOT FOUND handler.
V nßsledujφcφch strßnkßch lze zφskat podrobnosti o p°φkazech:
P°φklad pou₧itφ:
PROCEDURE Nejlepsi (OUT MaxFirma CHAR(20), OUT MaxObjed INT);
BEGIN
DECLARE err_notfound BIT DEFAULT FALSE;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' BEGIN SET err_notfound=TRUE; END;
DECLARE cur CURSOR FOR
SELECT Firmy.adresa, CAST (SUM(Objednavky.objed) AS INT)
FROM Firmy, Objednavky
WHERE Objednavky.firma=Firmy.firma
GROUP BY Firmy.firma
FOR READ ONLY;
DECLARE TatoHodnota INT;
DECLARE TatoFirma CHAR(20);
SET MaxObjed = 0;
OPEN cur;
LabelLoop: LOOP
FETCH NEXT FROM cur INTO TatoFirma, TatoHodnota;
IF err_notfound IS TRUE THEN LEAVE LabelLoop; END IF;
IF TatoHodnota > MaxObjed THEN
SET MaxObjed = TatoHodnota;
SET MaxFirma = TatoFirma;
END IF;
END LOOP LabelLoop;
CLOSE cur;
END ;