web-spirits
Goto Top

Letzter Datensatz wird zweimal ausgegeben. Warum?

Hallo,

Ich habe folgende Prozedur geschrieben:

use personal;

drop PROCEDURE if EXISTS p_gehalt;

DELIMITER $$

CREATE PROCEDURE p_gehalt(va_maxAvgGehalt DECIMAL(10,2))
p_start: BEGIN
  DECLARE va_loopDone BOOLEAN DEFAULT FALSE;	-- Loop Flag
  DECLARE va_loopCount INT DEFAULT 0;						-- Schleifen Zähler
  DECLARE va_avgGehalt DECIMAL(10,2);			-- Durchschnittsgehalt
  DECLARE va_name VARCHAR(50);					-- Mitarbeiter Nachname
  DECLARE va_vname VARCHAR(50);					-- Mitarbeiter Vorname
  DECLARE va_gehalt DECIMAL(10,2);

  DECLARE c_gehaltItem CURSOR FOR 
    SELECT name, vname, gehalt FROM mitarbeiter;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET va_loopDone = TRUE;

  SELECT avg(gehalt) FROM mitarbeiter INTO va_avgGehalt; -- Durchschnittsgehalt ermitteln

  OPEN c_gehaltItem;

  l_fetch_daten:LOOP
    IF va_loopDone THEN
		CLOSE c_gehaltItem;
		LEAVE l_fetch_daten;
    END IF;
    FETCH c_gehaltItem INTO va_name, va_vname, va_gehalt;
	SET va_loopCount = va_loopCount +1;
    SELECT va_name, va_vname, va_gehalt, va_avgGehalt;
    /* IF (va_gehalt < va_avgGehalt) THEN
		SELECT va_name, va_vname, va_gehalt;
	END IF; */
  END LOOP l_fetch_daten;
SELECT va_loopCount;
END p_start
$$

DELIMITER ;

CALL p_gehalt(2030);

Jetzt wird mir der letzte Datensatz in der Tabelle zweimal ausgegeben und ich weiß nicht wo der herkommt.
Ich habe auch geprüft ob der Datensatz zweimal in der Tabelle ist. Er kommt nur einmal vor.

Kann mir das vielleicht jemand erklären?

Danke schon mal und Grüße aus dem Norden.

Content-Key: 243243

Url: https://administrator.de/contentid/243243

Printed on: April 19, 2024 at 19:04 o'clock

Member: Jochem
Jochem Jul 11, 2014 at 08:32:08 (UTC)
Goto Top
Moin,

ich vermute mal, daß es um PHP geht, wenn nicht, vergiß den nachfolgenden Text.

Gemäß der Definition zu "declare continue"

Ein CONTINUE-Handler lässt die Ausführung der aktuellen Routine nach der Ausführung der Handler-Anweisung weiterlaufen. Ein EXIT-Handler dagegen beendet die Ausführung für die zusammengesetzte BEGIN ... END-Anweisung, in der er deklariert ist. 

wird die Begin ... End-Anweisung noch einmal durchlaufen und findet so den doppelten Satz.

In Zeile 26 bis 29 schickst Du die Routine zwar aus der Loop l_fetch_daten raus, aber die Begin ... End-Anweisung ist immer noch aktiv, wird also noch einmal durchlaufen.

Zeile 37 müßte dann aber auch hinter Zeile 38 liegen.

Gruß J face-smile chem