php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 15.10.2006, 00:27  
Erfahrener Benutzer
 
Registriert seit: 25.01.2004
Beiträge: 239
bicpi
Standard SP/Cursor/Ergebnis wird gedoppelt

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?
__________________
Viele Grüße
bicpi ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 15.10.2006, 12:52  
Erfahrener Benutzer
 
Registriert seit: 25.01.2004
Beiträge: 239
bicpi
Standard

Ich blicks zwar nicht ganz, aber mit einer REPEAT...UNTIL-Schleife funktioniert es jetzt:

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;
REPEAT
  FETCH cur INTO res;
  IF NOT done THEN
    SET ret = CONCAT(ret, res);
  END IF;
UNTIL done END REPEAT;
CLOSE cur;
SELECT ret;
END//

delimiter ;

CALL `myProc`();

DROP PROCEDURE `myProc`;
Das Ergebnis lautet dann:

Code:
+----------+
| ret      |
+----------+
| Ergebnis | 
+----------+
Naja, ich nehme mal grob an, dass der SQL-State 02000 erst ausgelöst wird, wenn FETCH einmal ins Leere gelaufen ist.
__________________
Viele Grüße
bicpi ist offline   Mit Zitat antworten
Alt 15.10.2006, 13:59  
Erfahrener Benutzer
 
Registriert seit: 05.07.2004
Beiträge: 1.476
DiBo33
Standard

Unterschied while .. do und repeat .. until Schleife

while .. do
Der Ausdruck wird geprüft und bei Erfüllung die Schleife abgearbeitet, der Datensatzzeiger bleibt auf dem letzten (vor der Prüfung) stehen

repeat .. until
Die Schleife wird auf jeden Fall abgearbeitet und am Ende auf Nichterfüllung geprüft, der Datensatzzeiger wird dabei eins weiter gesetzt.
DiBo33 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
cursor ergebnis, selectergebnis ist (cursor)

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:18 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.