Kurzory v SQL

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 ;