Hi,
ich habe mein Problem mal auf das Minimum reduziert.
Ich habe eine gespeicherte Prozedur, die mit einem Cursor arbeitet. Nun ist es so, dass die Schleife, die den Cursor ausliest, immer das letzte Ergebnis der SELECT-Abfrage doppelt. Folgendes Beispiel demonstriert dies:
Code:
delimiter //
CREATE PROCEDURE `myProc`()
BEGIN
DECLARE res VARCHAR(20);
DECLARE ret VARCHAR(20) DEFAULT '';
DECLARE done TINYINT DEFAULT 0;
DECLARE cur CURSOR FOR SELECT 'Ergebnis';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur;
WHILE NOT done DO
FETCH cur INTO res;
SET ret = CONCAT(ret, res);
END WHILE;
CLOSE cur;
SELECT ret;
END//
delimiter ;
CALL `myProc`();
DROP PROCEDURE `myProc`;
Die Ausgabe auf der Konsole lautet:
Code:
+------------------+
| ret |
+------------------+
| ErgebnisErgebnis |
+------------------+
obwohl ich nur einmal das Wort
Ergebnis erwarte. Wie kann das sein, wieso wird das gedoppelt?
Und egal, welche SELECT-Abfrage ich verwende, es ist immer der letzte Datensatz, der gedoppelt wird. Wenn in der Spalte
tab.os zb. die Werte
Linux,
Windows,
Mac eingetragen sind, würde die Cursor-Abfrage
Code:
SELECT os FROM tab;
das Ergebnis
Code:
Linux
Windows
Mac
Mac
liefern.
Irgendwie bricht die WHILE-Schleife nicht rechtzeitig nach dem letzten FETCHen ab...
Hat jemand eine Idee?