kane: Schleife läuft nur einmal durch (MySQL)

Guten Tag,

ich habe nun while und repeat in einer procedure getestet (MySQL neueste Version). Die procedure wird angelegt aber wenn ich die procedure "calle" läuft die schelife einmal durch und geht nicht weiter in die schleife z.b:

  
create procedure test_repeat (IN in_count INT)  
 BEGIN  
     declare count INT default 0;  
  
     increment: repeat  
         set count = count + 1;  
         select count;  
         until count > 10  
     end repeat increment;  
END  

gibt einmal 1 aus.

Irgendwer ne Ahnung warum das so ist?

Danke und Gruß

  1. Tach!

    Die procedure wird angelegt aber wenn ich die procedure "calle" läuft die schelife einmal durch und geht nicht weiter in die schleife z.b:

    Es liegt sicher nicht an der Schleife. Die wird ordentlich durchlaufen.

    create procedure test_repeat (IN in_count INT)

    BEGIN
         declare count INT default 0;

    increment: repeat
             set count = count + 1;
             select count;
             until count > 10
         end repeat increment;
    END

    
    >   
    > gibt einmal 1 aus.  
      
    Nein, das gibt nicht 1 aus. Das erzeugt 11 Ergebnismengen, von denen du vermutlich nur eine abfragst. Siehe [Stored Routine Syntax](http://dev.mysql.com/doc/refman/5.5/en/stored-routines-syntax.html), letzter Absatz. Nur eine Ergebnismenge würdest du erzeugen, wenn du die Werte zunächst in einer temporären Tabelle ablegtest und ganz zum Schluss ein einziges SELECT darauf abfeuertest.  
      
      
    dedlfix.
    
    1. hallo,

      leider ist es wirklich so das bei meinem Mysql die schleife nur einmal durchläuft. Gibt es da irgendwo ne einstellungen oder muss ich was anderes beachten?
      Ich rufe das ganze mit
      call test_repeat(10);
      auf

      gruß

      1. Tach!

        leider ist es wirklich so das bei meinem Mysql die schleife nur einmal durchläuft. Gibt es da irgendwo ne einstellungen oder muss ich was anderes beachten?

        Das glaube ich nicht. Wie hast du das überprüft? Dass du nur eine 1 bekommst, sagt nichts über die Arbeitsweise der Schleife aus. Erstell doch mal eine ganz normale Tabelle und füg zusätzlich in der Schleife mit INSERT den Wert in diese Tabelle.

        Ich rufe das ganze mit call test_repeat(10); auf

        Und weiter? Wie fragst du die 11(!) Ergebnismengen ab? Da steckt vermutlich dein Fehler drin, der dir nur eine 1 anzeigt, wenn du nur die Menge des ersten SELECT-Aufrufs abfragst. Nochmal: Jedes SELECT erzeugt eine eigene Ergebnismenge, durch die du dich zusätzlich zum Fetchen der Datensätze durchschalten musst. Wenn du nur eine Ergebnismenge haben möchtest, musst du deine Procedure wie bereits vorgeschlagen umgestalten.

        dedlfix.

        1. Hi,
          im moment kann ich es nicht testen aber

          Und weiter? Wie fragst du die 11(!) Ergebnismengen ab? Da steckt vermutlich dein Fehler drin, der dir nur eine 1 anzeigt, wenn du nur die Menge des ersten SELECT-Aufrufs abfragst. Nochmal: Jedes SELECT erzeugt eine eigene Ergebnismenge, durch die du dich zusätzlich zum Fetchen der Datensätze durchschalten musst. Wenn du nur eine Ergebnismenge haben möchtest, musst du deine Procedure wie bereits vorgeschlagen umgestalten.

          in der procedur im while body ist eine
          select count;

          der die zahl ausgibt. Sollte die Schleife mehrmals durchlaufen wir mehrmals dieses Select ausgeführt. Und "printet" mir als result dieses count (das hochgezählt wird)

          Ich weiss auch das die Procedure richtig ist nur läuft es nicht bei mir was verwunderlich ist.

          1. Tach!

            in der procedur im while body ist eine
            select count;
            der die zahl ausgibt.

            Nein. Select gibt nichts aus. Es erzeugt eine Ergebnismenge.

            Sollte die Schleife mehrmals durchlaufen wir mehrmals dieses Select ausgeführt. Und "printet" mir als result dieses count (das hochgezählt wird)

            Nein. Es erzeugt pro Aufruf eine Ergebnismenge.

            Ich weiss auch das die Procedure richtig ist nur läuft es nicht bei mir was verwunderlich ist.

            Würdest du bitte dein Augenmerk auf das Fetchen der Daten legen. Dort fragst du vermutlich nur die erste Ergebnismenge ab. Du musst, nachdem sich diese als vollständig abgefragt zu erkennen gibt, zur nächsten Ergebnismenge weiterschalten.

            Oder aber du stellst deine Procedur so um, dass sie nur eine Ergebnismenge liefert. Wir kommen an dieser Stelle nicht weiter, wenn du weiterhin ignorierst, dass du mehrere Ergebnismengen erzeugst und nicht wie bei einem nackigen Select nur eine einzelne.

            dedlfix.

            1. hi,
              ich habe nun ein insert eingefügt und du hast natürlich recht. Das war dann ein klassischer anfängerfehler meinerseits.
              danke für die hilfe.

              1. Tach!

                ich habe nun ein insert eingefügt und du hast natürlich recht. Das war dann ein klassischer anfängerfehler meinerseits.

                Übrigens befindet sich ein PHP-Beispiel zum Abfragen solcher mehrfachen Egebnismengen in der Beschreibung von mysqli_multi_query(). Benötigt wird also die mysqli-Extension, um an solche Ergebnismengen zu kommen. Die herkömmliche mysql-Extension ist nicht verwendbar, weil diese kein Multi-Query kennt. Man beachte in dem Beispiel vor allem, dass die Fetch-while-Schleife von einer Next-Result-do-while-Schleife eingerahmt ist.

                dedlfix.