Announcement

Collapse
No announcement yet.

MySQL stored procedure , zu viele Datensätze eingetragen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • MySQL stored procedure , zu viele Datensätze eingetragen

    Hallo !

    Für ein erstes testen habe ich eine stored procedure erstellt.
    Diese SP liest aus einer Tabelle die ID aus.
    In einem LOOP wird diese ID in eine andere Datenbank eingetragen.
    wenn ich die Originaltabelle mit der befüllten Tabelle vergleiche,
    dann stelle ich fest, daß der letzte Datensatz doppelt eingetragen wird.
    Irgendwie stimmt die Abbruchsbedingung im Loop nicht.

    Code:
    DROP PROCEDURE IF EXISTS `insertProgrammkategorie`$$
    
    CREATE DEFINER=`db1154036-noko`@`%` PROCEDURE `insertProgrammkategorie`()
    BEGIN
    	# declare variables
    	DECLARE idFetch INT DEFAULT NULL;
    	DECLARE breakFlag INT DEFAULT TRUE;
    	
    	# declare cursor
    	DECLARE csr CURSOR FOR SELECT id FROM tbl_programmdetails;
    	  
    	# declare handle
    	DECLARE CONTINUE HANDLER FOR NOT FOUND SET breakFlag = FALSE;
    	
    	# open cursor
    	OPEN csr;
    	
    	# start repeat
    	read_loop: LOOP
    	    IF FETCH csr INTO idFetch THEN
    	       INSERT INTO tbl_programmdetails_programmkategorie(programmdetails_id) VALUES (idFetch);
    	    ELSE
    		LEAVE read_loop;
    	    END IF;
    	END LOOP;
    	 
    	# close cursor
    	CLOSE csr; 
    	
        END$$
    
    DELIMITER ;

    Wer kann mit einer Idee weiterhelfen ?

    Mit freundlichen Grüßen

    Stephan

  • #2
    Hallo,
    Originally posted by Stephan123 View Post
    ...Irgendwie stimmt die Abbruchsbedingung im Loop nicht.
    Die stimmt nicht nur nicht, du hast gar keine Abbruchbedingung! FETCH ist keine Funktion, die irgendwie TRUE oder FALSE zurückliefert. FETCH löst eine "No Data condition with SQLSTATE value '02000'" aus, wenn kein Datensatz (mehr) gefetcht werden kann. Diese Ausnahme kann man mit einem Handler abfangen - was du ja auch gemacht hast. Für das korrekte Ende der Schleife mußt du dein "breakFlag" auswerten.
    [highlight=sql]
    CREATE DEFINER=`db1154036-noko`@`%` PROCEDURE `insertProgrammkategorie`()
    BEGIN
    # declare variables
    DECLARE idFetch INT DEFAULT NULL;
    DECLARE breakFlag INT DEFAULT FALSE;

    # declare cursor
    DECLARE csr CURSOR FOR SELECT id FROM tbl_programmdetails;

    # declare handle
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET breakFlag = TRUE;

    # open cursor
    OPEN csr;

    # start repeat
    read_loop: LOOP
    FETCH csr INTO idFetch

    if breakFlag THEN
    LEAVE read_loop;
    END IF;

    INSERT INTO tbl_programmdetails_programmkategorie(programmdeta ils_id) VALUES (idFetch);
    END LOOP;

    # close cursor
    CLOSE csr;

    END$$

    DELIMITER ;
    [/highlight]

    Anmerkung: Ich hab die Logik für das Breakflag umgedreht, damit es auch tatsächlich ein Break- und kein Continueflag ist.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk !

      Danke für die Antwort. Das war ein typischer Anfängerfehler. Ich habe die SP getestet.
      Leider bekomme ich noch eine Warnung.

      -----------
      0 row(s) affected, 1 warning(s)

      Execution Time : 5.070 sec
      Transfer Time : 0 sec
      Total Time : 5.070 sec

      Error Code : 1329
      No data - zero rows fetched, selected, or processed
      --------------

      Irgendwie wird vermutlich nochmals ein fetch durchgeführt.
      Ist das wieder die Abbruchbedingung ???

      Mit freundlichen Grüßen

      Stephan

      Comment


      • #4
        Originally posted by Stephan123 View Post
        Leider bekomme ich noch eine Warnung.
        Siehe: http://forums.mysql.com/read.php?98,...481#msg-420481

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment

        Working...
        X