Letzter Datensatz wird zweimal ausgegeben. Warum?
Hallo,
Ich habe folgende Prozedur geschrieben:
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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 243243
Url: https://administrator.de/contentid/243243
Ausgedruckt am: 25.11.2024 um 05:11 Uhr
1 Kommentar
Moin,
ich vermute mal, daß es um PHP geht, wenn nicht, vergiß den nachfolgenden Text.
Gemäß der Definition zu "declare continue"
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 chem
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 chem