Vinzenz Mai: stored procedures -> reuckgabewert

Beitrag lesen

Hallo,

warum ich keine funktion nehme, kann ich dir ehrlich gesagt nicht sagen. ich nehme an, dass dies dort auch nicht besser zu loesen ist, oder?

sowohl mit einer Funktion als auch mit einer Procedure kannst Du es richtig lösen. Da Du einen Skalar zurückgibst, reicht Dir eine Function aus.

CREATE DEFINER=user@% PROCEDURE ein_test(OUT out text)

SQL SECURITY INVOKER
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE res INT(10);
DECLARE hup VARCHAR(255);
DECLARE cur CURSOR FOR SELECT s.id FROM elv_season s;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;

OPEN cur;

WHILE NOT done DO
FETCH cur INTO res;

-- Hier passiert der Fehler!
-- Du hast einen CONTINUE-Handler definiert.
-- Wenn FETCH keinen Datensatz mehr liefern kann, wird done auf TRUE gesetzt.
-- Die nächste Anweisung wird aber selbstverständlich ausgeführt, was Du aber
-- nicht willst.
-- res bekommt anscheinend den Wert NULL (nicht getestet) und
-- CONCAT(irgendwas, NULL) ergibt NULL. So erklärt sich Dein NULL-Wert.

  set `out` = concat(`out`,',',`res`);  

-- Die unschöne und ineffiziente Lösung wäre es, das SET-Statement in eine
-- IF-Anweisung zu packen:

--     IF NOT done
--         SET out = CONCAT(out, ',', res);
--     END IF

-- Die bessere Variante ist es, statt einer strukturierten Schleife wie im
-- Handbuch die unstrukturierte Schleife mit LOOP zu verwenden.

END WHILE;

CLOSE cur;
END

  
Siehe dazu das Tutorial von Roland Bouman:  
[Why REPEAT and WHILE are usually not handy to handle MySQL CURSORs](http://rpbouman.blogspot.com/2005/09/why-repeat-and-while-are-usually-not.html)  
  
  
Freundliche Grüße  
  
Vinzenz