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.