Ein SQL CURSOR ist ein Zeiger auf das Ergebnis einer Abfrage, mit dem man die Zeilen eine nach der anderen verarbeitet. Normale SQL-Anweisungen arbeiten mengenbasiert: Sie betreffen alle passenden Zeilen auf einmal. Ein Cursor bricht diese Menge in einzelne Schritte auf – nötig, wenn pro Zeile eigene Logik läuft, etwa eine Berechnung, die von der vorherigen Zeile abhängt, oder ein Aufruf einer Prozedur je Datensatz.

Lebenszyklus eines Cursors

Ein Cursor durchläuft vier Phasen:

  • DECLARE – Cursor mit einer SELECT-Abfrage definieren
  • OPEN – Abfrage ausführen, Ergebnismenge bereitstellen
  • FETCH – nächste Zeile lesen (FETCH NEXT / INTO Variablen)
  • CLOSE – Cursor freigeben (in SQL Server zusätzlich DEALLOCATE)
DECLARE cur CURSOR FOR
  SELECT id, menge FROM lager WHERE menge < 5;
OPEN cur;
FETCH NEXT FROM cur INTO @id, @menge;
WHILE @@FETCH_STATUS = 0
BEGIN
  -- Zeilenweise Logik, z. B. Bestellung auslösen
  FETCH NEXT FROM cur INTO @id, @menge;
END;
CLOSE cur;
DEALLOCATE cur;

Cursor in MySQL-Stored-Procedures

MySQL erlaubt Cursor nur innerhalb von Stored Procedures. Anders als bei SQL Server braucht es einen CONTINUE HANDLER FOR NOT FOUND, der das Ende der Ergebnismenge signalisiert:

DECLARE fertig INT DEFAULT 0;
DECLARE cur CURSOR FOR SELECT id FROM kunden;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fertig = 1;
OPEN cur;
lesen: LOOP
  FETCH cur INTO @id;
  IF fertig = 1 THEN LEAVE lesen; END IF;
  -- Zeilenweise Verarbeitung
END LOOP;
CLOSE cur;

Wann Cursor sinnvoll sind – und wann nicht

Cursor sind deutlich langsamer als mengenbasierte SQL-Anweisungen: Jede FETCH-Operation kostet eine eigene Verarbeitungsrunde, oft zehn- bis hundertfach langsamer als ein einziges UPDATE mit WHERE. Wer SQL-Formulierungen kennt, kann die meisten „pro Zeile“-Probleme mit Set-Operationen, JOINs oder Fensterfunktionen lösen. Cursor bleiben sinnvoll für: Datenmigrationen mit komplexen Umrechnungen, Bereinigung einzelner Datensätze mit Fehlerprotokoll und Schnittstellen, die je Zeile einen externen Dienst aufrufen müssen.

Verwandte Grundlagen: SQL-Grundlagen, SQL INSERT, SQL DELETE, SQL LATERAL (mengenbasierte Alternative) und SQL SAVEPOINT für sichere Teilschritte bei langen Verarbeitungsläufen.